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

9
作为对这个问题的跟进:将子目录中的源代码添加到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
)

可以像这样做吗?
FILE(GLOB SUB_SOURCES *.cpp)
set(SOURCE
  ${SOURCE}
  ${CMAKE_CURRENT_SOURCE_DIR}/${SUB_SOURCES}
  PARENT_SCOPE
)

使用CMake编译一个目录及其子目录中所有源文件为一个单一输出文件(而不是多个库文件),最好的方法是什么?

2
https://dev59.com/2nNA5IYBdhLWcg3wSrma - drescherjm
你的 FILE(SUB_SOURCES *.cpp) 中缺少了 GLOB。请将其更改为 FILE(GLOB SUB_SOURCES *.cpp) - drescherjm
1个回答

18

我认为您正在寻找的是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的运行。

希望这对您有所帮助并且言简意赅。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接