假设我有一个目录结构如下:
/main.cpp
/CMakeLists.txt
/foo/foo.cpp
/foo/CMakeLists.txt
我的/CMakeLists.txt
文件包含以下内容:
project(Test)
add_subdirectory("foo")
add_executable(Test main.cpp foo/foo.cpp)
target_link_libraries(Test ${OpenNI_LIB})
和我的/foo/CMakeLists.txt
文件包含以下内容:
find_library(OpenNI REQUIRED)
当我在第一个add_subdirectory("foo")
中使用第CMakeLists.txt
行时,实际发生了什么?它是否在CMakeLists.txt
中搜索第二个foo
文件,并将内容添加到第一个?是否可以在第一个文件中定义第二个文件?特别是在这个例子中,变量${OpenNI_LIB}
是否会在第一个中被识别,因为它是在第二个中定义的?
感谢。
答案 0 :(得分:2)
是否在foo中搜索第二个CMakeLists.txt文件
是的,它确实
并将内容添加到第一个?
不,不。它执行许多配置操作,例如查找库等,并生成单独的Makefile和/或其他构建时工件。
特别是在这个例子中,变量$ {OpenNI_LIB}是否会在第一个中被识别,因为它是在第二个中定义的?
不,除非这样的结构
find_library(OpenNI REQUIRED) # this sets variables for OpenNI
# in the context of foo/CMakeLists.txt
set(OpenNI_LIB ${OpenNI_LIB} PARENT_SCOPE) # this copies ${OpenNI_LIB}
# into the context of /CMakeLists.txt
用于foo/CMakeLists.txt
默认情况下,子目录的CMakeLists.txt中定义的变量也在子目录的子目录中定义,即foo/
依次包含bar/
及其CMakeLists.txt
,然后在{{ <}}的bar/
$ {OpenNI_LIB}将被设置。
P.S。在CMakeLists.txt
的疑点,message(STATUS "Some message with ${VAR}")是你的朋友。只需查看cmake输出。