CMake 对已定义(预处理器)头文件的依赖

Posted

技术标签:

【中文标题】CMake 对已定义(预处理器)头文件的依赖【英文标题】:CMake dependency on defined (preprocessor) header file 【发布时间】:2011-07-01 09:12:00 【问题描述】:

我有一个配置文件设置,它为某些组件定义了要包含的正确头文件。稍后我通过预处理器令牌包含该文件。不幸的是,CMake 的依赖扫描器完全忽略了头文件。

基本上归结为:

#define HEADER_FILE "somefile.h"
#include HEADER_FILE

CMake 不会将 "somefile.h" 添加到此源文件的依赖项列表中!

如何让 CMake 正确识别这种依赖关系?

(我知道我可以执行 #if 0 块并包含所有文件,但这要么包括对其他来源的太多依赖,要么首先破坏了整个目的 - 取决于你如何做它)

【问题讨论】:

【参考方案1】:

您可以通过设置OBJECT_DEPENDS 属性向源文件添加显式依赖:

set_property(SOURCE source.cpp APPEND PROPERTY OBJECT_DEPENDS "somefile.h")

您必须对包含您的配置文件的任何源文件执行此操作。

【讨论】:

谢谢,这实际上对我在另一种情况下也有帮助(处理不受支持的源文件)。 在 CMAKE 下处理遗留代码并遇到这种情况。谢谢!【参考方案2】:

我可以建议使头文件通用而不是所有源文件吗?这也比您在任何生产代码中从未见过的方法更常见。

像这样:

// meh.hh
#ifndef MEH_HH
#define MEH_HH

#ifdef THIS
# include <this>
#elif defined(THAT)
# include <that>
#else
# error meh
#endif 

#endif // MEH_HH

// main.cc
#include "meh.hh"

int main () ...

【讨论】:

这正是我想要摆脱的(这是我以前做过的)。而不是简单地为每个标题定义一个我必须为所有这些标题有一个可配置的头文件。 为什么您的方法会优于规范方法?不仅 CMake 会为此苦苦挣扎,IDE 和编辑器(想想“switch header/source”或“goto file”)也一样 我的方法是 C 预处理器支持的方法:只需将 DEFINE 设置为要包含的文件的名称。它不涉及编写包装文件,因此维护较少。 我的 C 预处理器当然也支持 ;) 文档也是维护的,我认为少数包装文件更适合自文档,因为它们包含可用的定义,它甚至可以通过在这些包装器的顶部添加#defines 来工作。您的方法意味着您要么需要包含定义标头+标头,要么直接将定义提供给编译器。

以上是关于CMake 对已定义(预处理器)头文件的依赖的主要内容,如果未能解决你的问题,请参考以下文章

用CMake设置Visual Studio工程中预处理器定义值

自动生成依赖关系

在 Qt 中移动头文件时出现奇怪的预处理器行为

头文件你不得不知的那些事儿

我需要这个依赖于食人魔的头文件(Qgears)的帮助

#define宏作用