10

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

makefile 中使用的选项:

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

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

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

4

2 回答 2

23

问题

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

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

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

解决方案

预编译的头文件考虑到了这一点,所以你只需要:

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

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

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

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

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

笔记

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

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

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

于 2011-03-03T08:53:02.690 回答
2

/Yc 只能用于您的 .cpp 模块之一。这指定 VS 使用该模块创建预编译头文件。

对于您项目中的所有其他人,请使用 /Yu。这指定他们将简单地使用 pch。

它的 MSDN 条目在这里:http: //msdn.microsoft.com/en-us/library/szfdksca (v=VS.71).aspx

于 2011-03-03T08:37:01.913 回答