CMake - 将子目录中的所有源添加到cmake项目

the*_*ica 4 c++ cmake

作为这个问题的后续内容: 在子目录中将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.

我希望这对你有帮助.