在 CMake 中使用 target_sources() 添加源文件后删除它
Posted
技术标签:
【中文标题】在 CMake 中使用 target_sources() 添加源文件后删除它【英文标题】:Remove a source file after adding it with target_sources() in CMake 【发布时间】:2020-07-29 16:05:35 【问题描述】:我正在使用 CMake 3.16。
我使用 target_sources() 将我的源文件添加到我的目标中。我想稍后在我的 CMakeLists.txt 中删除我之前使用 target_sources() 添加的源文件。
例如:
target_sources(my_target PRIVATE main.c abc.c def.c ghi.c)
# Later...
# Remove def.c from the previously added source files.
有没有办法在不设置自定义“源”变量并使用 list(REMOVE_ITEM ...) 将其从列表中删除的情况下理想地做到这一点?
编辑: 这个问题的上下文是单元测试 C 中的静态函数。 我的程序由许多我想进行单元测试的静态函数组成。为了测试它们,我决定在测试文件中包含 .c 文件而不是 .h。
例如: abc.c:
#include "abc.h"
// several static functions defined here
abc.h:
// some stuff
test_abc.c:
#include "unity.h" // a unit test framework
#include "abc.c" // notice the .c instead of the .h to be able to test the static functions
// the test functions
通过这样做,如果我添加 test_xxx.c 文件,我需要在 CMake 中删除 xxx.c 文件,因为否则 xxx.c 文件的内容将被定义 2 次并且链接器不会对此感到满意.
【问题讨论】:
我认为我们正在查看meta.stackexchange.com/questions/66377/what-is-the-xy-problem,所以请退后一步并说明您为什么要这样做。 您提到使用一个变量。我宁愿使用 two:一个“基本”列表,一个带有额外来源。我认为应该更容易维护。但是,是的,这绝对是一个 XY 问题。 你可以试试这里提到的:***.com/questions/16449676/…. @Yunnosch 我编辑了我的问题以澄清上下文。 @user3389943 谢谢,但正如我所提到的,我想知道是否有除此之外的其他解决方案,因为我想坚持使用 target_sources()。将 target_sources() 与包含源的列表一起使用是否有意义? 【参考方案1】:您可以在有问题的源文件上将源文件属性HEADER_FILE_ONLY 设置为ON
。另见set_source_files_properties()。
从 CMake 版本 3.18 开始,如果源文件属于在不同目录中定义的目标,您也可以这样做:
set_source_files_properties(subdir/source.c TARGET_DIRECTORY target-from-subdir PROPERTIES HEADER_FILE_ONLY ON)
【讨论】:
以上是关于在 CMake 中使用 target_sources() 添加源文件后删除它的主要内容,如果未能解决你的问题,请参考以下文章
如何在 CMake GUI 中显示 FooConfig.cmake 文件中的 CMake 变量?