我的代码一直使用libcxx,sdl和其他一些库。我如何生成.pch考虑到每个标题可以包含一些其他标题(即使是像#ifdef #include #endif这样的复杂条件。这就是为什么很难理解所需的标题文件列表。我应该只使用在中找到的所有标题文件那个文件夹来创建.pch?在这种情况下,如何使用这种.pch性能呢?
更新:如果重要的话我会将它与Clang(不是GCC)一起使用,并通过Clang C API更具体。 UPDATE2:
我为单头文件创建了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
答案 0 :(得分:2)
GCC编译器仅适用于一个单独包含的预编译头,as explained in this answer。因此,如果您想在GCC中使用PCH,您需要为应用程序的所有翻译单元提供单个头文件(并且每个文件都应该以单 {{1}开头。 }指令)
我想这种情况对于支持一些预编译头的其他编译器也很有帮助。
C ++标准的未来版本(post C++14)可能会定义一个模块机制。参见例如n4047提案。
请注意,预编译的头文件非常符合编译器(使用GCC时,从GCC 4.9.1升级到GCC 4.9.2时它们甚至可能无法工作),因此您不应过多依赖它们。
答案 1 :(得分:1)
首先,我还没有将pch与gcc一起用于微软编译器。
#ifdef等条件在编译之前都已解决,因此如果更改预处理器变量,PCH文件仍会被编译。 所以只需添加你需要的lib的所有文件。
一般来说,包括所有不太可能经常更改的标头(即外部库和系统中稳定的部分)。
不要过多担心在pch文件中多次包含标题。由于此文件不会经常编译,因此可以忽略高编译时间。
我不确定当你在pch文件中包含所有内容时,execcutable文件大小是否会变大。这可能是这种情况,因为您引用了其他未使用的代码部分,这些代码部分只是因为您将它们添加到pch文件而编译到您的可执行文件中。 你可能想测试一下。
现在,根据我的经验,另一个重要的问题是编译时或链接时你的编译性能是否很慢。
当链接时间较长时,问题更有可能是代码中的标题中包含太多标题。
这可以通过在头文件中使用前向声明来优化,并且只包括.cpp文件中的头。我们有巨大的单片项目,每次编译/链接的最大性能提升都是通过尽可能多地向前声明来删除标头依赖项。
这是因为渐进式编译工作得非常好,但增量链接却没有。
以下是有关前瞻性声明的做法和不做的简短但很好的汇编: http://www.chromium.org/developers/coding-style/cpp-dos-and-donts