【发布时间】:2020-04-29 11:17:47
【问题描述】:
我正在处理我的第一个 CMake/C 项目,但在构建时遇到了一个问题,这让我重新质疑编译的工作原理。
我希望人们向我解释当您调用 add_executable 时究竟发生了什么以及 make 如何构建 C 文件依赖项。
我的想法
我认为,当调用 add_executable (name, sources) 时,CMake 会将 sources 视为构建目标名称所需的源文件的超集。因此,在内部,他通过分析包含main 的文件并递归地添加包含的.h 文件以及它们在.c 文件中的相关声明来分析REAL MINIMAL 依赖关系。
似乎发生了什么(我想要确认)
CMake 将 sources 视为可执行文件的真正最小依赖项。似乎它会编译 sources 中的任何内容,无论它是否在任何地方使用。
后果
这对我来说真的很烦人。在我的项目中,我使用源发现,这意味着 src 目录中的任何内容都将添加到源中。然后,如果我想编译一个单元测试(make this_unit_test),实际上就是编译我的源目录中的每个 .o 文件,而不是只编译必要的文件。这意味着如果我的项目的一部分没有构建某些东西,我就不能再构建任何测试了。
我能做什么?
如果 CMake 确实以您需要为任何可执行文件指定自己的最小依赖项的方式完成,我如何仍然使用自动源/测试发现?最好的解决方案是来自 CMakeList 文件,这是一个获取源文件列表的函数,并返回它的子集,该子集对应于包含 main 的文件在某个时间点实际包含的内容。人们如何解决这个问题?
【问题讨论】:
-
“在我的项目中我使用源代码发现” - 这到底是什么意思?您的意思是您使用像
*.c这样的文件“通配符”来查找所有源文件,而不是在CMakeLists.txt中明确列出它们? -
是的。我知道cmake说这很糟糕。如果 cmake 添加一个函数来做我想做的事情而不是强迫用户手动列出每个来源,那也不错(我真的不明白人们如何接受它作为一个干净的解决方案)。它可能被接受,因为解析源代码以分离 main 的无用内容比看起来更难。
标签: c cmake compilation