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

时间:2011-03-03 05:33:43

标签: 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文件应该至少生成一次。

2 个答案:

答案 0 :(得分:21)

问题

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

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

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

解决方案

预编译标题将此考虑在内,因此您只需要:

  1. 将所有常见且不变的包含放在一个头文件中(例如,StdAfx.h)
  2. 有一个空的CPP文件(比方说,StdAfx.cpp),只包含这一个头文件
  3. 现在,您需要告诉编译器StdAfx.cpp是包含公共和不变标题的空源。

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

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

    编译器将从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