我们使用 Visual Studio 2003 (VC71) 进行编译。
为了减少编译时间,我们更改了构建脚本,以便为每个 CPP 文件生成预编译头 (.pch) 文件。
makefile中使用的选项:
/Yc"StdAfx.h"
/Fp"StdAfx.pch"
这样目标的编译时间就减少了 30%。但是任何人都可以帮助我了解如何减少编译时间,即使每次编译每个 CPP 文件时都会生成 pch 文件。
另外,这是正确的方法吗?我们应该使用 Yc 和 Yu 组合吗?
我无法使用 /Yu 选项,因为 pch 文件应该至少生成一次。
问题
假设您有一个使用的标头列表,您知道这些标头不会更改。例如,C 头文件、C++ 头文件、Boost 头文件等。
为每个 CPP 文件编译读取它们需要时间,并且这不是生产时间,因为编译器一次又一次地读取相同的标头,并一次又一次地为这些相同的标头生成相同的编译结果。
应该有某种方法告诉编译器这些标头始终相同,并缓存它们的编译结果而不是一次又一次地重新编译它们,不是吗?
解决方案
预编译头考虑到了这一点,所以您需要做的就是:
- 将所有那些常见且不变的包含内容放在一个头文件中(例如,StdAfx.h)
- 有一个空的 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(使用前将#替换为@)