CMake——将子目录中的所有源代码添加到CMake项目中

CMake -- Add all sources in subdirectory to cmake project

本文关键字:CMake 添加 项目 源代码 子目录      更新时间:2023-10-16

作为这个问题的后续:在cmake项目的子目录中添加Source

选择子目录中的所有 .cpp和.h文件并将它们添加到父目录中定义的SOURCE变量的最佳方法是什么(可能使用FILE指令?)

上面问题的答案示例:

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)编译所有的源目录和子目录到一个单一的输出文件(不是多个库?)

我想你要找的是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
)

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

我希望这对你有帮助。