我有一个包含许多 Visual C++ 项目的解决方案,所有项目都使用 PCH,但有些项目打开了特定的编译器开关以满足项目特定的需求。

这些项目中的大多数在各自的 stdafx.h 中共享相同的标头集(STL、boost 等)。我想知道是否可以在项目之间共享 PCH,这样我就可以拥有一个解决方案中的大多数项目都可以使用的通用 PCH,而不是编译每个项目的每个 PCH。

似乎可以在项目设置中将 PCH 的位置指定为共享位置,因此我预感这可行。我还假设使用共享 PCH 的所有项目中的所有源文件都必须具有相同的编译器设置,否则编译器会抱怨 PCH 与正在编译的源文件之间不一致。

有人试过这个吗?有效吗?

一个相关问题:这样的分片 PCH 是否应该过度包容,或者会影响整体构建时间?例如,共享 PCH 可以包含许多广泛使用的 STL 标头,但某些项目可能只需要 <string><vector>. 。当优化器必须丢弃 PCH 拖入项目中的所有未使用的内容时,使用共享 PCH 节省的时间是否必须在构建过程的稍后时间点得到补偿?

有帮助吗?

解决方案

是的,它是可能的,我可以向你保证,节省的时间是显著。当您编译PCH,您必须将.pdb.idb文件从正在创建PCH文件的项目复制。就我而言,我有一个创建PCH文件一个简单的两级文件的项目。标题将是您的PCH头和源将被告知在项目设置创建PCH - 这是类似于您在任何项目中通常做什么。如你所提到的,你必须有每个配置相同的编译设置,否则的差异会出现和编译器会抱怨。

复制上述文件每次有一个重建或每次PCH被重新编译时间将是有疼痛感,所以我们将自动执行它。要自动复制,执行在上述文件复制到相应目录中的预生成事件。例如,如果您正在编制DebugRelease建立你的PCH中,将文件从PCH项目Debug到您的依赖项目的Debug复制。因此,一个复制命令是这样的

  

复制PchPath \调试* .PDB调试\ / -Y

请注意在结束时/-Y。第一个构建之后,以后每次构建以增量编译,因此,如果您再次更换文件时,Visual Studio会抱怨损坏的符号。如果他们这样做会损坏,您可以随时进行重建,这将再次复制文件(这个时候它不会跳过他们,因为他们不再存在 - 清理删除文件)。

我希望这有助于。我花了相当长的一段时间才能够做到这一点,但它是值得的。我有一个依赖于一个大的框架的几个项目,而PCH只需要被编译一次。所有相关的项目现在编译速度非常快。

  

编辑:随着其他几个人,我已经在VS2010测试这   和VS2012和它似乎正常工作。

其他提示

虽然这是一个老问题,但我想给出一个适用于 Visual Studio 2017 并且不涉及任何复制的新答案。唯一的缺点:编辑并继续不再起作用。

基本上,您必须为预编译头创建一个新项目,并让所有其他项目依赖于它。这是我所做的:

一步步:

  1. 在您的解决方案中创建一个新项目,其中包括标头(从此处称为 pch.h)和一个包含 pch.h 的一行 cpp 文件。该项目应该创建一个静态库。设置新项目以创建预编译头。输出文件需要可供所有项目访问。对我来说,这相对于 IntDir,但对于默认设置,它可能相对于 $(SolutionDir)。pch 项目必须只定义所有其他项目也有的定义。

    pch project settings

  2. 让所有其他项目都依赖于这个新项目。否则构建顺序可能是错误的。

    project references

  3. 设置所有其他项目以使用 pch.h。看一下,输出文件参数与 pch 项目中的参数如何相同。其他包含目录还需要指向 pch.h 目录。您可以选择强制将 pch 文件包含在每个 cpp 中(或者手动将其包含在每个 cpp 文件的第一行中)。

    pch include include

    1. 将所有项目(包括 pch 项目)设置为使用相同的编译器符号文件(链接器符号文件不受影响)。同样,在我的示例中,这是 OutDir,但在您的解决方案中,这可能会有所不同。它必须指向磁盘上的同一个文件。调试信息格式需要设置为C7(见上面的截图),否则Visual Studio将无法并行编译项目。pdb

我希望我没有忘记任何事情。对于我的解决方案(130k loc,160 个项目),这导致编译时间为 ~2:30 分钟,而不是 ~3:30 分钟。

看来,因为每个源文件必须被禁止对所述PCH被编译相同PDB编译这是不可能的。织补它。

Samaursa的回答为我工作。

我也看到此链接该作品(寻找雷金纳德的接近底部的答案)。

此一个采用copy而雷金纳德的用途xcopy(我喜欢xcopy)。无论哪种方式,感谢 - 这加速了我的建立大大

这听起来像“收益递减”给我的情况。假设包括公共报头直接浪费每cpp文件1秒,并且每个目标(DLL / EXE)具有10个cpp文件。通过使用每一个目标.PCH,为您节省每目标10秒。如果你的整个项目有10个目标,您可以节省整体构建,这是很好的1.5分钟。

但是,把它简化成一个.PCH整个项目,你只保存另外9秒。这值得么?额外的努力(其可以是多很多烦琐的设置,是一个非标准配置由VS向导不受支持)产生仅保存的第十。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top