c++ - 如何有效地使用预编译头文件(使用/Yc 和 Yu 选项)?

标签 c++ visual-studio build precompiled-headers

我们使用Visual Studio 2003 (VC71) 进行编译。 为了减少编译时间,我们更改了构建脚本,使其为每个 CPP 文件生成预编译头 (.pch) 文件。

makefile 中使用的选项:

/Yc"StdAfx.h"
/Fp"StdAfx.pch"

这样目标的编译时间减少了 30%。但是任何人都可以帮助我理解它是如何减少编译时间的,即使每次编译每个 CPP 文件时都会生成 pch 文件。

此外,这是正确的方法吗?我们应该使用 Yc 和 Yu 组合吗? 我不能使用/Yu 选项,因为 pch 文件应该至少生成一次。

最佳答案

问题

假设您有一个您知道不会更改的 header 列表。例如,C 头文件,或 C++ 头文件,或 Boost 头文件等。

为每个 CPP 文件编译读取它们需要时间,而且这不是有效时间,因为编译器一次又一次地读取相同的头文件,并一次又一次地为这些相同的头文件生成相同的编译结果。

应该有一些方法告诉编译器那些 header 总是相同的,并缓存它们的编译结果而不是一次又一次地重新编译它们,不是吗?

解决方案

预编译 header 会考虑到这一点,因此您只需:

  1. 将所有那些通用且不变的包含放在一个头文件中(例如,StdAfx.h)
  2. 有一个空的 CPP 文件(例如,StdAfx.cpp),其中仅包含一个头文件

现在,您需要告诉编译器 StdAfx.cpp 是包含通用和不变 header 的空源。

这是使用标志/Yc 和/Yu 的地方:

  • 使用/Yc 标志编译 StdAfx.cpp 文件
  • 使用/Yu 标志编译所有其他 CPP 文件

并且编译器将从 StdAfx.cpp 文件生成(需要时)一个预编译头文件,然后将这个预编译头文件重新用于所有其他标有/Yu 的文件。

注意事项

当您创建一个新项目时,旧版本的 Visual C++(如果我没记错的话,是 6 和 2003)会默认激活预编译头文件。最近的提供了激活或不激活它们的选择。

您应该创建一个新的 VC++ 项目并激活 PCH 以获得启用 PCH 的项目的工作版本,并研究编译选项。

有关PCH的更多信息,您可以访问以下网址:

关于c++ - 如何有效地使用预编译头文件(使用/Yc 和 Yu 选项)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5177046/

相关文章:

C# FTP 应用程序上传到本地目录

build - VSTS (VSO) 托管构建 .Net Framework 4.6.1

php - 为 PHP Web 应用构建系统

c++ - 声明嵌套 namespace `std`是否合法?

c++ - 在 C++ 中乘以枚举

c++ - 在 MFC 中使用 Direct2D 将 svg 文件转换为位图

c# - 数据表 C# 输入字符串的格式不正确

c++ - Xcode - 将二进制文件与调试和发布库链接

ios - 解析 Visual Studio 推送通知

c++ - jenkins 在构建 cpp 代码时无法识别错误