8

我的代码一直使用 libcxx、sdl 和其他一些库。考虑到每个标头都可以包含其他标头(即使有复杂的条件,例如#ifdef #include #endif,我如何生成.pch。这就是为什么很难理解所需的头文件列表。我应该只使用在要创建 .pch 的文件夹?在这种情况下如何使用这种 .pch 性能?

更新:如果重要的话,我将把它与 Clang(不是 GCC)一起使用,并通过 Clang C API 更具体。更新2:

我为单个头文件创建了 pch:

MBA-Anton:pch asmirnov$ clang++ -x c++-header header.h -emit-pch -o header.pch
MBA-Anton:pch asmirnov$ clang++ -include-pch header.pch source.cpp -o source -x c++

但我无法为多个文件生成 pch:

MBA-Anton:pch asmirnov$ clang++ -x c++-header header.h header2.h -emit-pch -o headers.pch
clang: error: cannot specify -o when generating multiple output files
4

2 回答 2

2

GCC编译器仅适用于一个包含的预编译标头如本答案中所述。因此,如果您想在 GCC 中使用 PCH,您需要为应用程序的所有翻译单元提供一个头文件(并且每个翻译单元都应该以该单个 #include指令开头)

我猜这种情况对于支持某些预编译头文件的其他编译器也很有帮助。

C++ 标准的未来版本(C++14之后)可能会定义模块机制。参见例如n4047提案。

请注意,预编译的头文件是非常特定于编译器的(对于 GCC,当从 GCC 4.9.1 升级到 GCC 4.9.2 时,它们甚至可能不起作用),所以你不应该过分依赖它们。

于 2014-11-04T09:04:16.697 回答
1

首先,我没有将 pch 与 gcc 一起使用,仅与 microsoft 编译器一起使用。

#ifdef 等条件在编译之前都已解决,因此如果您更改预处理器变量,PCH 文件仍然会被编译。因此,只需添加您需要的库中的所有文件。

一般来说,包括所有不太可能经常更改的标头(即外部库和系统中稳定的部分)。

不要太担心在您的 pch 文件中多次包含标题。由于此文件不会经常编译,因此您可以在此处忽略高编译时间。

我不确定的是,当您将所有内容都包含在 pch 文件中时,可执行文件的大小是否会变大。可能是这种情况,因为您引用了其他未使用的代码部分,这些代码部分被编译到您的可执行文件中,只是因为您将它们添加到了您的 pch 文件中。你可能想测试一下。

现在,根据我的经验,另一个重要的问题是编译或链接时您的编译性能是否很慢。

当您的链接时间较长时,问题更有可能是您在代码的标头中包含太多标头。

这可以通过在头文件中使用前向声明并仅包括 .cpp 文件中的头来优化。我们有庞大的单体项目,每次编译/链接的最大性能提升都是通过尽可能多地前向声明来删除头文件依赖项。

这是因为增量编译工作得很好,但增量链接却不行。

以下是关于前向声明的注意事项的简短但很好的汇编:http: //www.chromium.org/developers/coding-style/cpp-dos-and-donts

于 2014-11-04T09:02:12.803 回答