【问题标题】:CMake -- Add all sources in subdirectory to cmake projectCMake -- 将子目录中的所有源添加到 cmake 项目
【发布时间】:2014-08-01 03:35:20
【问题描述】:

作为对这个问题的跟进: Add Source in a subdirectory to a cmake project

选择所有子目录中的 .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)?

【问题讨论】:

标签: c++ cmake


【解决方案1】:

我认为您正在寻找的是aux_source_directory 命令。

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

aux_source_directory( )

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

使用这个命令来避免写入源列表是很有诱惑力的 库或可执行目标的文件。虽然这似乎有效, 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。

我希望这对您有所帮助并切中要害。

【讨论】:

    猜你喜欢
    • 2012-02-14
    • 1970-01-01
    • 2017-11-21
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多