gpt4 book ai didi

c++ - 有什么办法可以同时使用多个预编译头文件和 Clang?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:15:04 26 4
gpt4 key购买 nike

我正在使用 clang++ 命令行来了解预编译 header 的工作原理。我有这样的东西:

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

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

如果我只“-include”两个头文件中的一个,编译就会成功,并且比我不包含任何一个都更快,这是预编译头文件的正常方式。但是当我同时包含这两者时(如上所述),我得到了这个错误:

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

有没有办法(不一定要使用-include)使用多个.h.pch预编译头文件来加速一个.cpp文件的编译?我知道预处理器倾向于导致 header 相互影响(即使仅通过包含防护),这样的功能会变得非常复杂。我真的不希望得到我想要的支持,现在我已经考虑了一下。但我想在这里确认。上面的错误信息是提示性的但并不全面,而且 Clang 用户手册似乎也没有告诉我答案....

最佳答案

结果是: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 本身可能有另一个依赖它,将链扩展到三个或更多步骤,尽管我不确定这一点。当我试图通过大约 15 或 20 个链接来扩展涉及真实代码的链时,PCH 文件大小最终以一种看似错误的方式爆炸,每一步大约增加一倍。这最终为 header 生成了 300 MB PCH 文件,如果在不尝试链接的情况下将其编译到 PCH 中,将生成小于 6 MB 的文件。这发生在 Clang 3.6.something 和 Clang 3.7.0 中。我想这是一个错误,但谁知道呢。在达到我想要确定并报告它的地步之前,我放弃了我的探索。也许 PCH 链无论如何都不会变得很长。这个功能似乎不是人们通常使用的东西....

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

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

顺便说一句,GCC 似乎不支持任何与我想要的相关的东西。

关于c++ - 有什么办法可以同时使用多个预编译头文件和 Clang?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34714183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com