一、使用默认的预编译头
       要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件),想必大家都知道 StdAfx.h这个文件。很多人都认为这是VC提供的一个“系统级别”的,编译器带的一个头文件。其实不是的,这个文件可以是任何名字的。我们来考察一个典型的由AppWizard生成的MFC Dialog Based 程序的预编译头文件。(因为AppWizard会为我们指定好如何使用预编译头文件,默认的是StdAfx.h,这是VC起的名字)。我们会发现这个头文件里包含了以下的头文件:

  1. #include <afxwin.h> // MFC core and standard components
  2. #include <afxext.h> // MFC extensions
  3. #include <afxdisp.h> // MFC Automation classes
  4. #include <afxdtctl.h> // MFC support for Internet Explorer 4
  5. Common Controls
  6. #include <afxcmn.h>

这些正是使用MFC的必须包含的头文件,当然我们不太可能在我们的工程中修改这些头文件的,所以说他们是稳定的。那么我们如何指定它来生成预编译头文件。我们知道一个头文件是不能编译的。所以我们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件里只有一句代码就是:#include “Stdafx.h”。原因是理所当然的,我们仅仅是要它能够编译而已。也就是说,要的只是它的.cpp的扩展名。我们可以用/Yc编译开关来指定StdAfx.cpp来生成一个.pch文件,通过/Fp编译开关来指定生成的pch文件的名字。右键StdAfx.cpp——》属性——》C/C++——》预编译头,如下所示。

然后可以通过/Yu编译开关来使用预编译头,右键解决方案——》属性——》C/C++——》预编译头,如下图所示。

二、创建并使用自己的预编译头

在VS中设置预编译头从而提高编译速度,其实这种方法在之前工作的时候也碰到过,今天写程序时发现每次修改后再编译的速度很慢,让人崩溃!于是采用设置预编译头的方法,结果编译速度大幅提高!本文通过我这次的程序实例讲解这种方法。
        先看下VS中工程的文件结构。

其中common.h文件中内容为:

  1. #define _COMMON_H_
  2. #include <pcl/ModelCoefficients.h>
  3. #include <pcl/point_types.h>
  4. #include <pcl/io/pcd_io.h>
  5. #include <pcl/filters/extract_indices.h>
  6. #include <pcl/filters/voxel_grid.h>
  7. #include <pcl/filters/radius_outlier_removal.h>
  8. #include <pcl/features/normal_3d.h>
  9. #include <pcl/kdtree/kdtree.h>
  10. #include <pcl/sample_consensus/method_types.h>
  11. #include <pcl/sample_consensus/model_types.h>
  12. #include <pcl/segmentation/sac_segmentation.h>
  13. #include <pcl/segmentation/extract_clusters.h>
  14. #include <pcl/visualization/pcl_visualizer.h>
  15. #include <iostream>
  16. #include <pcl/io/io.h>
  17. #include <pcl/io/pcd_io.h>
  18. using namespace pcl;
  19. #endif    // _COMMON_H_

common.h文件中主要是包含一些PCL工程的头文件,这些头文件是很大的,common.h文件很少需要修改且被众多的源文件include。这三个条件很重要,因为本文介绍的方法的有效性就是基于这三个条件。在工程segment_plane中,每个.cpp和.h文件都包含common.h文件。倘若不设置预编译头的话,编译很慢,每次修改后在编译也很慢。原因后面解释,下面介绍其设置方法:

  • 在工程配置属性中设置“使用预编译头文件”

  • 设置“创建预编译头文件”
        在【解决方案资源管理器】中右键precompile.cpp文件,在属性页中设置创建预编译头文件

你可能觉得这个文件命名方式有点奇怪,其实这个文件没什么实际内容,仅仅是创建预编译头文件用的,这个文件几乎不会被改动!precompile.cpp的文件内容如下:

  1. #include "common.h"
  2. #include "typesdef.h"

通过以上两部设置之后,编译就变得非常快了。这是为什么呢?

       我们知道在编译之前有个编译预处理过程,这个过程中会将所有的头文件的内容复制到源文件中,普通的头文件复制也没什么,但是正如之前所说,这些头文件内容很多,那么复制头文件内容所花时间就很大了。而采用设置预编译头的方法编译时间就会大幅缩小,这是因为编译器会先编译precompile.cpp,生成一个precompile.pch文件,之后编译其他.cpp文件就会直接使用precompile.pch中的内容,这样就避免了大量的复制,从而大幅缩短编译时间。
        注意设置预编译头后,编译时可能会出现:
  1. error C3859: 超过了PCH的虚拟内存范围;请使用“-Zm33”或更大的命令行选项重新编译

这是因为头文件过多,内容过大造成的,解决方案可以参考:http://blog.csdn.net/caoshangpa/article/details/75208197

参考链接:http://blog.csdn.net/ly416/article/details/24735441

http://blog.csdn.net/caoshangpa/article/details/75207977

VC++ 使用预编译头的更多相关文章

  1. codeblocks + MinGW 以及vc 使用预编译头文件的方法

    MinGW编译器: 1.打开工程文件,在工程文件浏览其中,在你要设置为预编译的头文件上,点击鼠标右键,选择“属性(properties)”  你会看到一个多页面的属性框,选择“构建(build)”页面 ...

  2. C++预编译头文件 – stdafx.h

    预编译头文件的由来 也许请教了别的高手之后,他们会告诉你,这是预编译头,必须包含.可是,这到底是为什么呢?预编译头有什么用呢? 咱们从头文件的编译原理讲起.其实头文件并不神秘,其在编译时的作用,就是把 ...

  3. 预编译头文件pch

    1.         预编译头文件 作用:提高编译效率.预编译头文件(扩展名为.PCH),是为了提高编译效率而使用的一种方法,把一个工程中较稳定的代码预先编译好放在一个文件(.PCH)里.避免每次编译 ...

  4. c++中 预编译头文件PCH

    转载:https://blog.csdn.net/lovemysea/article/details/74858430 一.预编译头文件使用经验: 如果预编译头文件被正确使用时,它确实大大提高我们编程 ...

  5. 浅谈VC++中预编译的头文件放那里的问题分析

    用C++写程序,肯定要用预编译头文件,就是那个stdafx.h.不过我一直以为只要在.cpp文件中包含stdafx.h 就使用了预编译头文件,其实不对.在VC++中,预编译头文件是指放到stdafx. ...

  6. VC中关于预编译头文件的概括,以及无法打开预编译头文件的错误解决

    1.预编译头文件 在VC中编译器一般都是以文件为单位进行编译,如果修改了工程中的一个文件,那么将导致所有文件都要从新编译,这样的编译将耗费很长时间.为了提高编译速度,将那些不常被修改,比较稳定,文件单 ...

  7. VC++中解决“在查找预编译头使用时跳过”的方法

    Visual C++ Concepts: Building a C/C++ ProgramCompiler Warning (level 1) C4627Error Message": sk ...

  8. vc编程中出现 fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”?

    解决办法菜单--〉项目--〉设置,出现“项目设置”对话框,左边展开项目,在“源文件”中找到出错的文件,然后在右边选择“C/C++”属性 页,在Category下拉框中选择“Precompiled He ...

  9. VS2010遇到fatal error C1083: 无法打开预编译头文件:“xxx.pch”: No such file or directory

    对C++和VS2010非常不熟悉,但是无奈赶着项目,只能看了点基础就上手,然后就碰到这个问题了. 原因分析: http://bbs.csdn.net/topics/340191697?page=1 编 ...

随机推荐

  1. 详解springmvc控制登录用户session失效后跳转登录页面

    springmvc控制登录用户session失效后跳转登录页面,废话不多少了,具体如下: 第一步,配置 web.xml <session-config> <session-timeo ...

  2. Nginx+uswgi+Django部署

    详情参考: http://blog.csdn.net/a_little_snail/article/details/78045636

  3. css 水平垂直居中的方法总结

    在项目中经常会遇到设置元素水平垂直居中的需求.而且具体的场景也不同,所以将个人总结的方法做个汇总,希望对浏览者有用. 以下所举的例子都以一个html为准,这里规定好一些公用样式. body { bac ...

  4. PatentTips - Well bias control circuit

    BACKGROUND OF THE INVENTION The present invention relates to a semiconductor integrated circuit devi ...

  5. 判断文件是否存在的另一种方法 _access 和 _waccess

    函数原型: int _access( const char *path, int mode ); int _waccess( const wchar_t *path, int mode ); 示例代码 ...

  6. java 原子量Atomic举例(AtomicReference)

    java并发库提供了很多原子类来支持并发访问的数据安全性,除了常用的 AtomicInteger.AtomicBoolean.AtomicLong 外还有 AtomicReference 用以支持对象 ...

  7. 【u025】贝茜的晨练计划

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运动方式是每天进行N(1 <= ...

  8. 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(1)GCC介绍及C语言编译过程

    一.GCC基本介绍 GCC(GNU Compiler Collection,GNU编译器套装),是一套由GNU开发的编程语言编译器.它是一套以GPL及LGPL许可证所发布的自由软件,也是GNU计划的关 ...

  9. SharePoint Permission Analyzer 权限分析仪

    SharePoint Permission Analyzer 权限分析仪         这是一个很好的应用,为了分析SharePoint权限.它会扫描整个网站集,建一个站点的权限架构.       ...

  10. WPF 好看的矢量图标

    原文:WPF 好看的矢量图标 本文告诉大家一个好用的网站,里面提供很多好看的图标. 本文介绍的网站是 Xamalot 里面有很多好看的图标. 例如我找到了一个好看的图标 我只需要点击下面的下载就可以了 ...