c++ - 在 Visual Studio 中的项目之间共享预编译头文件

标签 c++ visual-c++ precompiled-headers pch

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

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

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

有人试过吗?有用吗?

一个相关的问题:这样的分片 PCH 是否应该过度包容,还是会影响整体构建时间?例如,共享 PCH 可能包含许多广泛使用的 STL header ,但某些项目可能只需要 <string><vector> .使用共享 PCH 节省的时间是否必须在构建过程的稍后阶段进行偿还,此时优化器必须丢弃 PCH 拖入项目的所有未使用的东西?

最佳答案

是的,这是可能的,我可以向您保证,节省的时间非常可观。编译 PCH 时,必须从创建 PCH 文件的项目中复制 .pdb.idb 文件。就我而言,我有一个简单的两个文件项目,它正在创建一个 PCH 文件。 header 将是您的 PCH header ,源将被告知在项目设置下创建 PCH - 这类似于您在任何项目中通常会执行的操作。正如您所提到的,您必须为每个配置设置相同的编译设置,否则会出现差异并且编译器会提示。

每次重建或每次重新编译 PCH 时都复制上述文件会很痛苦,因此我们将其自动化。要自动复制,请执行预构建事件,将上述文件复制到适当的目录。例如,如果您正在编译 PCH 的 DebugRelease 版本,请将文件从 PCH 项目的 Debug 复制到依赖项目的调试。所以复制命令看起来像这样

copy PchPath\Debug*.pdb Debug\ /-Y

注意末尾的 /-Y。在第一次构建之后,每个后续构建都会增量编译,因此如果再次替换文件,Visual Studio 会提示符号损坏。如果它们确实损坏了,您始终可以执行重建,这将再次复制文件(这次它不会跳过它们,因为它们不再存在 - 清理会删除文件)。

我希望这会有所帮助。我花了很长时间才能够做到这一点,但这是值得的。我有几个项目依赖于一个大框架,PCH 只需要编译一次。现在所有的依赖项目都编译得非常快。

EDIT: Along with several other people, I have tested this under VS2010 and VS2012 and it does appear to work properly.

关于c++ - 在 Visual Studio 中的项目之间共享预编译头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/645747/

相关文章:

c++ - 使用 Rcpp 复制 dplyr::group_by 的索引功能

c++ - Boost http 服务器示例不起作用?

c++ - 如何使用 Bluez5.50 通过 BLE 连接加密数据

visual-c++ - 0xC0000005 - 访问冲突(每次来自不同的 dll)

visual-studio - 跳过函数输入参数的复制构造函数的调试?

c++ - 使用 GNU make 创建多个预编译头文件

c++ - 如何让 GCC 在当前源文件目录之前的目录中搜索头文件?

c++ - Voidcast宏解释

c++ - 如何通过重载 << 运算符打印出 vector 中的对象?

C++ 我必须为每个源文件包含标准库吗?