我们正在使用Visual Studio 2003(VC71)进行编译。 为了减少编译时间,我们更改了构建脚本,以便为每个CPP文件生成预编译的头文件(.pch)。
makefile中使用的选项:
/Yc"StdAfx.h"
/Fp"StdAfx.pch"
这样,目标的编译时间减少了30%。但是,任何人都可以帮助我理解它是如何减少编译时间的,即使每次编译每个CPP文件时都会生成pch文件。
此外,这是正确的方法吗?我们应该使用Yc和Yu组合吗? 我不能使用/ Yu选项,因为pch文件应该至少生成一次。
答案 0 :(得分:21)
假设您有一个您知道不会改变的标题列表。例如,C头,C ++头,或Boost头等。
为每个CPP文件编译读取它们需要时间,这不是生产时间,因为编译器一次又一次地读取相同的标题,并且一次又一次地为这些相同的标题生成相同的编译结果。
应该有一些方法告诉编译器那些头文件总是一样的,并缓存他们编译的结果,而不是一次又一次地重新编译它们,不是吗?
预编译标题将此考虑在内,因此您只需要:
现在,您需要告诉编译器StdAfx.cpp是包含公共和不变标题的空源。
这是使用flags / Yc和/ Yu的地方:
编译器将从StdAfx.cpp文件生成(在需要时)预编译的头文件,然后将这个预编译的头文件重用于标记为/ Yu的所有其他文件。
当你创建一个新项目时,旧版本的Visual C ++(6和2003,如果我没记错的话)会默认激活预编译的头文件。最近的选择提供了激活它们的选择。
您应该创建一个新的VC ++项目,并激活PCH以获得启用PCH的项目的工作版本,并研究编译选项。
有关PCH的更多信息,您可以访问以下网址:
答案 1 :(得分:2)
/ Yc只能在您的某个.cpp模块上使用。这指定VS使用该模块创建预编译头。
对于项目中的所有其他人,请使用/ Yu。这指定他们只是使用pch。
它的MSDN条目在这里:http://msdn.microsoft.com/en-us/library/szfdksca(v=VS.71).aspx