【发布时间】:2021-10-23 23:08:04
【问题描述】:
我有一个 C++ 项目,其中所有实现源文件 (*.cpp) 都位于项目目录中的 src 目录中。一些文件位于其他子目录中。假设 src/foo/ 中有 50 个文件。我需要将这些文件列为add_library 和/或target_sources 函数的一部分。
现在,无论在哪里,都不鼓励自动添加目录中的所有文件,这对我来说很好。所以我要手动列出所有文件;但是将通用前缀 src/foo/ 重复 50 次似乎真的很愚蠢而且很烦人。
在the documentation for target_sources 中说
相对源文件路径被解释为相对于当前源目录(即 CMAKE_CURRENT_SOURCE_DIR)。
所以我在调用target_source 之前添加了set(CMAKE_CURRENT_SOURCE_DIR "src/foo/"),但它不起作用。 (我收到“找不到源文件”错误。)
那么,如果可能的话,实现我想要的正确方法是什么?
注意:项目的(公共)头文件 (*.hpp) 位于 include 目录中(在 src 之外)。使用 target_include_directories 函数很好地配置(无需列出单个文件)。
【问题讨论】:
-
我认为@Kamil Cuk 的回答回答了你的问题。但我想添加设置
CMAKE_CURRENT_SOURCE_DIR不起作用,因为这是一个 CMake 设置变量。此外,根据 CMake 的“源”目录不一定与源文件的目录有任何关系。这只是 CMake 正在处理的当前目录(即当前 CMakeLists.txt 所在的位置)。 -
关于第一部分,是的,你是对的,谢谢。我还发现路径扩展至少需要 CMake 3.13 并设置
cmake_policy(SET CMP0076 NEW)。关于第二部分,这有点可惜。如果有一个清晰、一致的命名法会很好(我认为),其中 SOURCE 总是指实现文件,而 INCLUDE 总是指头文件。 -
可以安全地假设,如果一个变量以
CMAKE_开头,它(通常)由 CMake 管理。当您在项目中使用add_subdirectory()并且需要知道 CMake 当前正在处理脚本的确切位置时,CMAKE_CURRENT_SOURCE_DIR相对于CMAKE_SOURCE_DIR的用处就显现出来了。