![](/img/trans.png)
[英]CMake: add all files on current directory and subdirectories with target_sources()
[英]CMake: set directory for target sources
我有一个 C++ 项目,其中所有实现源文件 (*.cpp) 都位于项目目录中的src目录中。 一些文件位于更远的子目录中。 假设src/foo/ 中有 50 个文件。 我需要将这些文件列为add_library
和/或target_sources
函数的一部分。
现在,无论在哪里,都不鼓励从目录中自动添加所有文件,这对我来说很好。 所以我将手动列出所有文件; 但是重复公共前缀src/foo/ 50 次似乎很愚蠢而且很烦人。
相对源文件路径被解释为相对于当前源目录(即 CMAKE_CURRENT_SOURCE_DIR)。
所以我在调用target_source
之前添加了set(CMAKE_CURRENT_SOURCE_DIR "src/foo/")
但它不起作用。 (我收到“找不到源文件”错误。)
那么,如果可能的话,实现我想要的东西的正确方法是什么?
注意:项目的(公共)头文件 (*.hpp) 位于包含目录中(在src之外)。 这是使用target_include_directories
函数很好地配置(无需列出单个文件)。
但重复公共前缀 src/foo/ 50 次
只需在来源前面加上前缀。
set(target_sources
source1.c
source2.c
)
list(TRANSFORM target_sources PREPEND "src/foo/")
将CMAKE_CURRENT_SOURCE_DIR
设置为旧CMAKE_CURRENT_SOURCE_DIR
的相对变量是行不通的。 如果它被设置为一个值,那么可以假设删除该值并使用自定义值是错误的,因为您错过了它之前设置的值。
您可能希望将其设置为绝对路径,或使用set(CMAKE_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/foo/")
,或者像其他人一样做并始终复制粘贴前缀。 这是标准做法(这也是我仍然使用 GLOB 的原因之一,因为我很懒),跟进显式优于隐式(这是不使用GLOB
)。
您还可以在src/foo
中使用add_subdirectory(src/foo)
和CMakeLists.txt
,您只需将
target_sources( <your target> PRIVATE|PUBLIC|INTERFACE
your
list
of
sources
)
我认为那会相当优雅。
我会建议(如果你有 bash 或一些类似的 shell)
function prepend() { while read line; do echo "${1}${line}"; done; }
ls *.cc *hh | sort | prepend "\${CMAKE_CURRENT_SOURCE_DIR}/"
然后复制粘贴:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.