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

2024-03-06

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

makefile中使用的选项:

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

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

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


问题

假设您有一个使用的标头列表,您知道这些标头不会更改。例如,C 头文件、C++ 头文件、Boost 头文件等。

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

应该有某种方法告诉编译器这些标头始终相同,并缓存它们的编译结果而不是一次又一次地重新编译它们,不是吗?

解决方案

预编译头考虑到了这一点,所以您需要做的就是:

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

现在,您需要告诉编译器 StdAfx.cpp 是包含通用且不变的标头的空源代码。

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

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

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

Note

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

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

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

  • http://msdn.microsoft.com/en-us/library/szfdksca.aspx http://msdn.microsoft.com/en-us/library/szfdksca.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何有效地使用预编译头(使用 /Yc 和 Yu 选项)? 的相关文章

随机推荐