我有一个包含许多 Visual C++ 项目的解决方案,所有项目都使用 PCH,但有些项目打开了特定的编译器开关以满足项目特定的需求。
这些项目中的大多数在各自的 stdafx.h 中共享相同的标头集(STL、boost 等)。我想知道是否可以在项目之间共享 PCH,这样我就可以拥有一个解决方案中的大多数项目都可以使用的通用 PCH,而不是编译每个项目的每个 PCH。
似乎可以在项目设置中将 PCH 的位置指定为共享位置,因此我预感这可行。我还假设使用共享 PCH 的所有项目中的所有源文件都必须具有相同的编译器设置,否则编译器会抱怨 PCH 与正在编译的源文件之间不一致。
有人试过这个吗?有效吗?
一个相关的问题:这样的分片 PCH 是否应该过度包容,或者会影响整体构建时间?例如,共享 PCH 可以包含许多广泛使用的 STL 标头,但某些项目可能只需要<string>
and <vector>
。当优化器必须丢弃 PCH 拖入项目中的所有未使用的内容时,使用共享 PCH 节省的时间是否必须在构建过程的稍后时间点得到补偿?
是的,这是可能的,我可以向您保证,节省的时间非常可观。当你编译你的PCH时,你必须复制.pdb
and .idb
来自正在创建 PCH 文件的项目的文件。就我而言,我有一个简单的两个文件项目,用于创建 PCH 文件。标头将是您的 PCH 标头,并且源将被告知在项目设置下创建 PCH - 这与您在任何项目中通常执行的操作类似。正如您所提到的,每个配置都必须具有相同的编译设置,否则会出现差异并且编译器会抱怨。
每次重建或每次重新编译 PCH 时复制上述文件将会很痛苦,因此我们将自动化它。要自动复制,请执行预构建事件,将上述文件复制到适当的目录。例如,如果您正在编译Debug
and Release
构建您的 PCH,从以下位置复制文件Debug
您的 PCH 项目转移到您的依赖项目的Debug
。所以复制命令看起来像这样
复制 PchPath\Debug*.pdb Debug\ /-Y
请注意/-Y
在最后。第一次构建后,每个后续构建都会增量编译,因此如果再次替换文件,Visual Studio 将抱怨符号损坏。如果它们确实损坏,您始终可以执行重建,这将再次复制文件(这次不会跳过它们,因为它们不再存在 - 清理会删除文件)。
我希望这有帮助。我花了相当长的时间才能够做到这一点,但这是值得的。我有几个项目依赖于一个大框架,并且 PCH 只需要编译一次。现在,所有依赖项目的编译速度都非常快。
编辑:我和其他几个人一起在 VS2010 下测试了这个
和VS2012,它看起来确实工作正常。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)