CMake:设置目标源的目录
CMake: set directory for target sources
我有一个C++项目,其中所有实现源文件(*.cpp)都驻留在项目目录内的src目录中。某些文件位于其他子目录中。假设src/foo/中有 50 个文件。我需要将这些文件列为add_library
和/或target_sources
功能的一部分。
现在,无论在哪里看,都不鼓励自动添加目录中的所有文件,这对我来说很好。所以我将手动列出所有文件;但是重复通用前缀src/foo/50 次似乎真的很愚蠢,而且很烦人。
在target_sources的文档中,它说
相对源文件路径被解释为相对于当前源目录(即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/")
您还可以在src/foo
中使用add_subdirectory(src/foo)
和CMakeLists.txt
,您只需将
target_sources( <your target> PRIVATE|PUBLIC|INTERFACE
your
list
of
sources
)
我认为这将是相当优雅的。
将CMAKE_CURRENT_SOURCE_DIR
设置为旧CMAKE_CURRENT_SOURCE_DIR
的相对变量是行不通的。如果它设置为一个值,那么假设删除该值并使用自定义值将是错误的是公平的,因为您错过了它之前设置的内容。
您可能希望将其设置为绝对路径,或使用set(CMAKE_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/foo/")
,或者像许多其他人一样并始终复制粘贴前缀。这是标准做法(这也是我仍然使用 GLOB 的原因之一,因为我很懒),跟进显式比隐式更好(这是不使用GLOB
的重点)。
我会建议(如果你有bash或一些类似的shell)
function prepend() { while read line; do echo "${1}${line}"; done; }
ls *.cc *hh | sort | prepend "${CMAKE_CURRENT_SOURCE_DIR}/"
然后复制并粘贴:)
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 在 CMake 中为每个目标设置编译器/链接器标志
- 制作文件:没有规则来制定目标:如何设置正确的规则?
- CMake 设置使用不正确的参数数调用的目标属性
- 如何通过导入的目标传递设置"CMAKE_EXE_LINKER_FLAGS"?
- CMAKE+QT MAC 如何设置部署目标?
- CMake:设置目标源的目录
- 在 MSVC 中将某些库的目标平台版本设置为 10.x 是否使程序与在 Windows Vista/7/8 上运行不兼容
- boost::msm 用法:如何设置目标状态的属性
- 如何在 NS2 环境中为 AODv 协议设置“仅目标”标志
- c++, Mac OS X, Xcode 8: Compile Boost:设置部署目标为OS X 10.11
- GNU Make -在规则/目标中设置shell命令输出中的MAKEFILE变量
- 如何设置一个目标后的变量
- 如何将code::块设置为在目标链接器选项之前链接项目链接器选项
- makefile.我为一组目标设置LDADD
- 没有将目标设置为/usr/lib/libX11.so的规则
- 如何使用Visual C++编译器在Windows上构建库时正确设置目标操作系统版本
- 如何在cmake中动态设置目标库