有没有办法与Clang同时使用多个预编译头?

时间:2016-01-11 04:26:53

标签: c++ clang precompiled-headers

我正在使用clang ++命令行来学习预编译头文件的工作原理。我有这样的事情:

clang++ [several lines of options] sourcefile.cpp -o sourcefile.o -include durr.h -include hurr.h

其中通过命令行包含的两个标头已预编译到相应的.h.pch文件中。

如果我" -include"只是两个标题中的一个,编译成功并且比我没有包含时更快,以预编译标头的正常方式。但是当我包括两者时(如上所述),我得到了这个错误:

clang: warning: precompiled header 'hurr.h.pch' was ignored because '-include hurr.h' is not first '-include'

有没有办法(不一定使用-include)使用多个.h.pch预编译头文件来加速编译一个.cpp文件?我知道这样的功能会因预处理器导致标头彼此影响的趋势而严重复杂化(即使只是通过包含警卫)。现在我已经考虑过了一点,我真的不希望得到支持。但我想在这里确认一下。以上错误信息是暗示但不全面的,Clang用户手册似乎没有告诉我答案....

1 个答案:

答案 0 :(得分:1)

事实证明:Clang支持"链接" PCH文件,这是一个允许一个PCH代表另一个PCH的扩展的功能。如果在稍后的编译期间包含后者,则它和它所依赖的PCH将用于加速编译。我想。

这样的事情可能会产生普通的PCH:

clang++ -x c++-header header1.h -o header1.h.pch

而且,如果我理解正确(可疑),那么像这样的东西会产生一个链接的PCH,它会扩展header1.h.pch:

clang++ -x c++-header header2.h -o header2.h.pch -include-pch header1.h.pch

然后可以使用两个PCH文件链来加速编译:

clang++ source.cpp -o source.o -include-pch header2.h.pch

(命令中不需要提到父PCH; header2.h.pch已经知道我认为在哪里找到它。)

我还没有找到明确要求这种"链接"通过命令行。在编译另一个PCH时简单地包括PCH似乎会产生一个链式PCH ...可能。我的证据确实存在,主要是在header2.h实际上包含header1.h的情况下,这种技术似乎产生了一个小的header2.h.pch和一个大的header1.h.pch,即使有人会期望如果链接不是&发生这种情况后,header2.h.pch通常会比header1.h.pch大,因为它至少包含了尽可能多的信息。这似乎与我理解PCH链接的目的相符:它通过将依赖PCH的重复信息存储为另一个PCH内容的廉价参考来节省资源。

我随意的探索表明,一个依赖的PCH本身可能有另一个依赖它,将链延伸到三个或更多步,尽管我不确定这一点。当我试图通过十五或二十个链接来扩展涉及实际代码的链时,PCH文件大小最终会以一种看似错误的方式爆炸,每一步大约加倍。这最终为标题生成了300 MB的PCH文件,如果编译成PCH而没有任何链接尝试,则会产生小于6 MB的文件。这发生在Clang 3.6.something和Clang 3.7.0中。我想这是一个错误,但谁知道呢。我放弃了我的探索,然后才到达我想要把它钉住并报告的地步。也许PCH链无论如何都不会长得很长。这个功能似乎不是人们通常使用的东西......

无论如何,似乎没有办法做我真正想要的事情:混合任意两个任意PCH,只要它们没有直接相互冲突,无论它们是如何被创建的。如果一个PCH依赖于另一个,则链接仅允许两个PCH一起使用。我一直对通过为项目中的每个标题创建PCH然后在编译期间将PCH组合在一起来加速编译感兴趣。但是用链式PCH实现这一点似乎需要制作一个PCH文件树,其中多个PCH可以对应于单个头。我实际上试图自动生成这样的东西,似乎成功了...但是上面提到的"错误" (如果错误的话)让我陷入困境,并且在我成功的程度上,节省的时间不足以保证继续。

还有某种"模块" Clang中可能与此相关的系统。但我的印象是,试图利用它来实现我想要的效果,如果它甚至可以成功,可能需要我将我的源代码更改为特殊的东西,也许是非标准的东西。虽然我没有调查它,所以也许没有。但无论如何,我猜标准C ++最终可能会获得模块,然后所有这些混乱(我希望)将成为过去。

GCC似乎并不支持任何与我想要的相关的东西。

相关问题
最新问题