作为这个问题的后续内容: 在子目录中将Source添加到cmake项目中
什么是最好的方法(可能使用FILE指令?)来选择子目录中的所有 .cpp和.h文件,并将它们添加到父目录中定义的SOURCE变量?
回答上述问题的例子:
set(SOURCE
${SOURCE}
${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp
${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp
PARENT_SCOPE
)
set(HEADERS
${HEADERS}
${CMAKE_CURRENT_SOURCE_DIR}/file1.hpp
${CMAKE_CURRENT_SOURCE_DIR}/file2.hpp
PARENT_SCOPE
)
Run Code Online (Sandbox Code Playgroud)
可以这样做吗?
FILE(GLOB SUB_SOURCES *.cpp)
set(SOURCE
${SOURCE}
${CMAKE_CURRENT_SOURCE_DIR}/${SUB_SOURCES}
PARENT_SCOPE
)
Run Code Online (Sandbox Code Playgroud)
什么是最好的方法(使用CMake)将目录和子目录中的所有源编译成单个输出文件(不是多个库?)
小智 9
我认为你要找的是aux_source_directory命令.
aux_source_directory查找目录中的所有源文件.
aux_source_directory()
收集指定目录中所有源文件的名称,并将列表存储在提供的文件中.此命令旨在供使用显式模板实例化的项目使用.模板实例化文件可以存储在"Templates"子目录中,并使用此命令自动收集,以避免手动列出所有实例化.
使用此命令避免编写库或可执行目标的源文件列表很有诱惑力.虽然这似乎有效,但CMake无法生成一个知道何时添加新源文件的构建系统.通常,生成的构建系统知道何时需要重新运行CMake,因为CMakeLists.txt文件被修改为添加新源.当源只是添加到目录而不修改此文件时,必须手动重新运行CMake以生成包含新文件的构建系统.
子目录中的CMakeLists.txt可能如下所示:
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} SUB_SOURCES)
set(SOURCE
${SOURCE}
${SUB_SOURCES}
PARENT_SCOPE
)
Run Code Online (Sandbox Code Playgroud)
但是,正如您从文档中看到的那样,建议的做法是在CMakeLists.txt中单独列出文件,因为对CMakeLists.txt文件的更改会触发运行cmake.
我希望这对你有帮助.