多个CMakeLists

时间:2015-08-21 23:14:51

标签: cmake

假设我有一个目录结构如下:

/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}是否会在第一个中被识别,因为它是在第二个中定义的?

感谢。

1 个答案:

答案 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输出。