c++ - 在 VC++ 项目中开始使用 PCH

标签 c++ visual-c++ compilation precompiled-headers

我正在 VS 2012 中处理一个 VC++ 项目,完整编译需要大约 8-10 分钟。我知道 PCH 可以将编译时间加快 10 倍。我目前在我的项目中禁用了 PCH,我在需要的地方包含了头文件。如何开始使用 PCH?我到处寻找“如何”指南,但我得到的只是文档。

我假设我必须:

  • 为 PCH 配置我的项目,创建一个空白的 PCH 头文件
  • 从每个 .cpp 收集标题文件并将其放入PCH头文件
  • 修改每个文件,删除所有头文件导入
  • 重新编译并希望一切正常;)

  • 我如何开始这个(特别是#1)?您是否修改过一个项目以使用 PCH,其中有哪些绊脚石或常见问题/问题? PCH 是否会导致任何问题,还是与正常包含的编译时/运行时行为相同?是否有工具可以自动化该过程,还是我必须手动浏览 500 个 .cpp 文件并修改它以使用 PCH?

    最后但并非最不重要的是,我可以期待 PCH 的编译时间加速是多少?是 2x-10x 吗?或者它会快30%? (这并不能证明所涉及的时间是合理的)

    最佳答案

    将我的项目配置为使用 PCH 后,完整编译时间减少了一半,增量构建几乎立即发生。 PCH 是一种非常有效的加速编译时间的方法,我强烈推荐它。

    您好 dsharlet提到了许多重要的点,他跳过了一些我最终必须弄清楚的关键步骤。因此,这是配置项目以使用 PCH 的完整指南:

    在 VC++ 项目中开始使用 PCH

  • 备份您的 src dir 和任何其他包含源代码的目录......(如果出现任何问题,您将需要它)
  • 在您的项目中创建 2 个文件,Globals.cppGlobals.h ..(选择任何名称,但要坚持)
  • 右键单击 Globals.cpp并打开 属性 ,选择配置 > 所有配置
  • 转到 C/C++ |预编译头,并填写这些:
  • 预编译头 : 创建 (/Yc)
  • 预编译头文件 : Globals.h
  • 开通 Globals.cpp并添加这一行,仅此而已:#include "Globals.h"
  • 右键单击您的 VC++ 项目并打开 属性 ,选择配置 > 所有配置
  • 转到 C/C++ |预编译头,并填写这些:
  • 预编译头 : 使用 (/Yu)
  • 预编译头文件 : Globals.h
  • 打开所有.h.cpp项目中的文件,并将其添加到最顶部:#include "Globals.h"
  • 开通 Globals.h并将以下内容添加到:(非常重要的是您在顶部有 #pragma once)
     #pragma once
    
     #include <stdio.h>
     #include <stdlib.h>
     #include <stdarg.h>
     #include <stddef.h>
     #include <memory>
     #include <string.h>
     #include <limits.h>
     #include <float.h>
     #include <time.h>
     #include <ctype.h>
     #include <wchar.h>
     #include <wctype.h>
     #include <malloc.h>
     #include <locale.h>
     #include <math.h>
    
     // Windows SDK
     #define _WIN32_WINNT 0x0501     // _WIN32_WINNT_WINXP
     #include <SDKDDKVer.h>
    
     // Windows API
     #define WIN32_LEAN_AND_MEAN
     #include <windows.h>
    
  • 这些包括是您的 PCH 文件的典型候选者
  • 删除您不使用的包含
  • 浏览你的项目并收集更多的头文件 不要经常更换
  • 使用查找和替换,搜索每个 #include 's 在您的 PCH 文件中,并将它们从所有 .h 中删除和 .cpp项目中的文件。
  • 做一个完整的编译并确保一切正常。以下是您将遇到的常见问题的一些解决方案:


  • PCH 文件包含自身:

    您的 PCH 文件包含一个再次包含 PCH 头文件的 header ,从而创建了一种循环依赖关系。双击错误将您带到有问题的文件,只需删除显示 #include "Globals.h" 的行。

    undefined symbol X

    尽管您的所有项目文件都可以包含 PCH header ,但包含在 PCH header 中的文件不能包含 PCH header ! (如上所述)因此您需要重新添加以前在文件中的任何导入。 (将文件与备份版本进行区分)

    找不到符号 logf

    有时全局 PCH 文件不会按预期运行,并且会因无法解决的疯狂错误而中断编译。然后您可以关闭单个源代码文件的 PCH。
  • 右键单击您的 .cpp文件并打开 属性 ,选择配置 > 所有配置
  • 转到 C/C++ |预编译头,并填写这些:
  • 预编译头 : 不使用预编译头
  • 删除该行 #include "Globals.h"在您的 .cpp文件
  • 添加回文件最初拥有的任何导入。 (将文件与备份版本进行区分)
  • 关于c++ - 在 VC++ 项目中开始使用 PCH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16707031/

    相关文章:

    c++ - 如何在 C++ 中获取不同 vector 的 vector

    c++ - 如何从wxWebView获取响应

    c++ - strtok 字符串并修改 token 值

    c++ - 使用 GDI C++ 动画方 block

    c++ - 错误 C2059 : syntax error 'constant'

    java - 如何在使用 Java 的 Compiler API 进行编译时添加调试信息

    compilation - 如何将参数传递给保存的 SBCL 核心?

    c++ - 通过可移动物体

    visual-studio-2008 - 2008 MFC和线程?

    android - 在使用 android studio 运行 Espresso 测试时。我收到以下错误