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

Rob*_*cks 8 c++ compilation precompiled-headers visual-c++

我正在开发VS 2012中的VC++项目,整个编译大约需要8-10分钟.我知道PCH可以将编译时间提高10倍.我目前在我的项目中禁用了PCH,并且我将头文件包含在需要它们的位置.我如何开始使用PCH?我到处寻找"如何"指南,但我得到的只是文档.

我假设我必须:

  1. 为PCH配置我的项目,创建一个空白的PCH头文件
  2. 从每个.cpp文件中收集标头并将其放入PCH头文件中
  3. 修改删除所有标头导入的每个文件
  4. 重新编译并希望没有出错;)

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

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

Rob*_*cks 8

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

Althouh dsharlet提到了很多重要的观点,他跳过了我最终想出的一些关键步骤.以下是配置项目以使用PCH的完整指南:

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

  1. 备份您的src目录和包含源代码的任何其他目录...(如果出现任何问题,您将需要它)

  2. 在项目中创建2个文件,Globals.cpp然后Globals.h..(选择任何名称,但坚持使用)

  3. 右键单击Globals.cpp并打开" 属性",选择"配置> 所有配置"

  4. 转到C/C++ | 预编译头,并填写以下内容:

    • 预编译标题:创建(/ Yc)
    • 预编译的头文件:Globals.h
  5. 打开Globals.cpp并添加这一行,而已:#include "Globals.h"

  6. 右键单击VC++项目并打开" 属性",选择"配置">" 所有配置"

  7. 转到C/C++ | 预编译头,并填写以下内容:

    • 预编译标题:使用(/ Yu)
    • 预编译的头文件:Globals.h
  8. 打开所有.h.cpp项目中的文件,并在最高层补充一点: #include "Globals.h"

  9. 打开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>
    
    Run Code Online (Sandbox Code Playgroud)
    • 这些包括您的PCH文件的典型候选人
    • 删除您未使用的包含
    • 浏览您的项目并收集不经常更改的任何头文件
  10. 使用查找和替换,搜索每一个的#include"在你的PCH文件,并从所有中删除.h,并.cpp在您的项目文件.

  11. 做一个完整的编译,确保一切正常.以下是您将遇到的常见问题的一些解决方案:


PCH文件包括:

您的PCH文件包含一个再次包含PCH头文件的头,创建一种循环依赖.双击错误将您带到违规文件,只需删除显示的行#include "Globals.h"


未定义的符号X.

虽然所有项目文件可以包含PCH头,包含的文件里面的PCH头不能包含PCH头球攻门!(如上所述)所以你需要添加以前在文件中的任何导入.(使用备份版本区分文件)


找不到符号logf

有时,全局PCH文件的行为不符合预期,并且会因无法解决的疯狂错误而中断编译.然后,您可以关闭PCH以获取单个源代码文件.

  1. 右键单击.cpp文件并打开" 属性",选择"配置">" 所有配置"

  2. 转到C/C++ | 预编译头,并填写以下内容:

    • 预编译标头:不使用预编译标
  3. 删除线#include "Globals.h"在你的.cpp文件

  4. 添加文件最初具有的任何导入.(使用备份版本区分文件)