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

时间:2014-08-01 03:35:21

标签: c++ cmake

作为这个问题的后续行动: Add Source in a subdirectory to a cmake project

最好的方法(可能使用FILE指令?)选择 all 子目录中的.cpp和.h文件,并将它们添加到父目录中定义的SOURCE变量中? / p>


回答上述问题的例子:

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
)

是否可以做这样的事情?

FILE(GLOB SUB_SOURCES *.cpp)
set(SOURCE
  ${SOURCE}
  ${CMAKE_CURRENT_SOURCE_DIR}/${SUB_SOURCES}
  PARENT_SCOPE
)

最好的方法(使用CMake)将目录和子目录中的所有源编译成单个输出文件(不是多个库?)

1 个答案:

答案 0 :(得分:9)

我认为你要找的是aux_source_directory命令。

  

aux_source_directory查找目录中的所有源文件。

     

aux_source_directory()

     

收集指定目录中所有源文件的名称   并将列表存储在提供的中。这个命令是   旨在供使用显式模板的项目使用   实例。模板实例化文件可以存储在   "模板"子目录并使用此自动收集   命令以避免手动列出所有实例化。

     

使用此命令避免编写源列表很有诱惑力   库或可执行目标的文件。虽然这似乎有效,   CMake没有办法生成一个知道何时a的构建系统   新的源文件已添加。通常是生成的构建系统   知道何时需要重新运行CMake,因为CMakeLists.txt文件是   修改为添加新源。当源只是添加到   目录无需修改此文件,必须手动完成   重新运行CMake以生成包含新文件的构建系统。

子目录中的CMakeLists.txt可能如下所示:

aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} SUB_SOURCES)

set(SOURCE
  ${SOURCE}
  ${SUB_SOURCES}
  PARENT_SCOPE
)

但是,正如您从文档中看到的那样,建议的做法是在CMakeLists.txt中单独列出文件,因为对CMakeLists.txt文件的更改会触发运行cmake。

我希望这很有帮助,而且非常重要。