CMake:为目标源设置目录

Chr*_* K. 4 c++ cmake

我有一个 C++ 项目,其中所有实现源文件 (*.cpp) 都位于项目目录中的src目录中。一些文件位于更远的子目录中。假设src/foo/ 中有 50 个文件。我需要将这些文件列为add_library和/或target_sources函数的一部分。

现在,无论在哪里,都不鼓励从目录中自动添加所有文件,这对我来说很好。所以我将手动列出所有文件;但是重复公共前缀src/foo/ 50 次似乎很愚蠢而且很烦人。

target_sources 的文档中,它说

相对源文件路径被解释为相对于当前源目录(即 CMAKE_CURRENT_SOURCE_DIR)。

所以我set(CMAKE_CURRENT_SOURCE_DIR "src/foo/")在调用之前添加了target_source但是它没有用。(我收到“找不到源文件”错误。)

那么,如果可能的话,实现我想要的东西的正确方法是什么?

注意:项目的(公共)头文件 (*.hpp) 位于包含目录中(在src之外)。这很好地配置(无需列出单个文件)与target_include_directories功能。

Kam*_*Cuk 5

但重复公共前缀 src/foo/ 50 次

只需在来源前面加上前缀。

set(target_sources
    source1.c
    source2.c
)
list(TRANSFORM target_sources PREPEND "src/foo/")
Run Code Online (Sandbox Code Playgroud)

  • 尽管 CMake 的“新方式”(正如某些人所说)应该摆脱(直接)设置变量,而采用“基于属性”的方法,但它确实有效并且非常优雅(恕我直言)。另外,对于 CMake 初学者阅读本文,转换后的列表将用作“add_library(MyProj SHARED ${target_sources})” (4认同)
  • 请注意,“TRANSFORM”仅从 CMake 3.12 开始可用。 (2认同)