在GNU/Linux环境/工具链中,预编译头的优缺点是什么?

Cat*_*kul 24 c++ linux gcc precompiled-headers

预编译的标题似乎可以在大型项目中节省大量时间,但似乎也是一个有点陷阱的痛苦.

使用预编译头文件的优点和缺点是什么,特别是因为它适用于在Gnu/gcc/Linux环境中使用它们?

Nor*_*sey 10

预编译头的唯一潜在好处是,如果构建太慢,预编译头可能会加快它们的速度.潜在的缺点:

  • 更多Makefile依赖项以获得正确; 如果他们错了,你就快速建立错误的东西.不好.

  • 原则上,并非每个头都可以预编译.(考虑在#include之前放一些#define.)那么gcc实际上哪些情况正确?你想要相信这个前沿功能多少钱?

如果您的构建足够快,则没有理由使用预编译头.如果您的构建太慢,我会考虑

  • 购买速度更快的硬件,与工资相比便宜

  • 使用像AT&T nmake这样的工具或类似ccache(Dirk正确),这两种工具都使用值得信赖的技术来避免重新编译.

  • 实际上gcc很好地处理了PCH.如果在包含pch之前存在#define,则不使用pch并使用普通包含.您可能还想考虑更新自己,PCH现在已经在gcc中存在了大约五年,并且不再是最前沿的. (4认同)

qua*_*ana 8

我无法与GNU/gcc/linux交谈,但我已经在vs2005中处理了预编译的头文件:

优点:

  • 当您拥有许多模块包含的大标头时,可以节省编译时间.
  • 适用于不经常更改的标题(例如来自第三方).

缺点:

  • 如果将它们用于变化很大的标题,则会增加编译时间.
  • 可以很好地设置和维护.
  • 如果您不强制编译预编译的头,则有时会明显忽略对标头的更改.

  • 尽管如此,支持和利弊也适用于gcc. (7认同)

Dir*_*tel 5

ccache的缓存前端到GCC,G ++,gfortran,......我的伟大工程.正如其网站所说

ccache是​​一个编译器缓存.它充当C/C++编译器的缓存预处理器,使用-E编译器开关和哈希来检测何时可以从缓存中满足编译.这通常会导致常见编译速度提高5到10倍.

在Debian/Ubuntu的,只是做" apt-get install ccache"和创造,比如说软链接,/usr/local/bin其名称gcc,g++,gfortran,c++,...这点/usr/bin/ccache.

[ 编辑 ]为了使这一点更明确以回应一些早期的评论:这通过缓存更大的编译步骤块来提供基本上预编译的头和源.因此它使用类似于预编译头的想法,并进一步进行.加速可能是戏剧性的 - 如网站所说,是5到10倍.

  • -1:我不确定这与预编译的头文件有什么关系. (6认同)
  • 这与预编译头文件无关. (6认同)
  • 我确定你对'ccache`是正确的,它用在我工作的项目上,所以如果你回答'哪个是更好的预编译头文件或者ccache?'这样的问题,你的答案可能会很好,或者"有没有替代预编译的标题来加速编译?".但不是这个问题. (4认同)
  • 老实说,即使它没有回答具体问题,我认为*也是相关的. (4认同)
  • @Martin:它只是渲染预编译的头文件没用.即使没有预编译的头文件,也可以加快编译速度. (3认同)
  • 废话.我避免重新编译,这很好,但有些不同.在单个项目中,如果您的构建系统中等,它通常会为您节省__nothing__.PCH本身可以加快编译速度. (2认同)

Mar*_*wis 5

对于普通 C,我会避免使用预编译头。正如您所说,它们可能会导致问题,并且与常规编译相比,预处理时间非常短。

对于 C++,预编译头文件可能会节省大量时间,因为 C++ 头文件通常包含大型模板代码,其编译成本很高。我没有使用它们的实际经验,因此我建议您衡量一下在项目中节省了多少编译时间。为此,使用预编译头编译整个项目一次,然后删除单个目标文件,并测量重新编译该文件需要多长时间。