在 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 中访问源文件名?

如何在 CMake GUI 中显示 FooConfig.cmake 文件中的 CMake 变量?

在cmake中使用ccache

如何在不使用 CMake 但仅使用 make 的项目中合并使用 CMake 的仅标头库?

cmake的缓存变量可以用于cpp源码中吗

Windows下使用CMake进阶