`
talentluke
  • 浏览: 592374 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

正确使用预编译头

 
阅读更多

摘自 http://38288890.blog.163.com/blog/static/19612845320081164495863/

做C++的项目的时候最怕的就是编译速度缓慢,前段时间一直抱怨C++/CLI编译OSG项目速度很慢很慢,我以为是OSG的inline函数过多的问题,但确实也是这个问题,每次处理的时候都要处理很多的inline,造成了编译速度的缓慢,往往修改一个文件整个工程都要重新编译,那速度可想而知。但总也要有一个解决方案啊,以前知道预编译头能够加速工程的编译,但是我设置了预编译头,怎么还是那么慢呢?肯定是我使用方法不对。

在网上Google了一圈以后找到了预编译头的正确使用,感谢作者的启迪。

引用最重要的部分:

如果预编译头文件被正确使用时,它确实大大提高我们编程的效率(你工作中,有多少时间是在等编译完成?很多吧,这个时候一般都很无聊,无奈,浪费时间)。但是他太容易用错了. 下面是几种常见的错误用法.

1) 在预编译头文件里include自己的头文件(当然, 如果你的头文件不经常变化, 也可以)

原因:自己的头文件一般会经常变, 便利后导致预编译的东东重新编译, 降低了编译速度.

2) 在其他的头文件里也include 预编译头文件

假设你的其他头文件也include了预编译头文件, 如果别人引用你的这个头文件又没有设置成预编译头文件, 那引用你头文件的这个人就煎熬了.

原 因:由于你用到的.h文件里include了预编译头文件,他在他本身的project里,vs能够判断的出他是预编译头,也能找的到需要的pch, pdb文件。所以对写这个.h文件的人没影响。但是你作为他的客户,你工作在你的project下,你include了他的h头文件,而这时vs判断不出 他的头文件里include的stdafx是预编译头文件,做普通文件编。那可想而知,他的stdafx里如果有import外面大型的库(如 inventor的tlb,非常慢,我们犯了这个错),那编译速度简直是煎熬。最要命的是,以后你做任何简单的修改都要重编,这和预编译解决的问题恰好相 反了。

下面给出一个使用预编译头文件的操作步骤, 享受一下预编译头文件给我们带来的编译速度的提升: 

1) 添加一个stdafx.h文件(名字随便取, 这里用了VS默认提供的名称), 在这个.h文件里include要使用的头文件(一般是外部的库, 自己写的不常变的头文件也可以加进来) 

2) 添加一个stdafx.cpp文件, 并include "stdafx.h" 

3)项目属性-->c/c++-->Precompiled设置为Use Precompiled Header, stdafx.h 

4)stdafx.cpp属性-->c/c++->Precompiled设置为Create Precompiled Header, stdafx.h 

done!


试了一下改动一点点东西需要编译3分钟的项目,现在瞬间完成!!终于起作用了!

分享到:
评论

相关推荐

    预编译资料- 预编译资料

    预编译详细资料,共90页。 掌握宏定义的使用方法;  掌握文件包含的使用方法;  了解条件编译的使用方法。 §7.1 概 述 C语言的编译系统分为编译预处理和正式编译,这是C 语言的一大特点,其中...

    MySQL预编译功能详解

     大家平时都使用过JDBC中的PreparedStatement接口,它有预编译功能。什么是预编译功能呢?它有什么好处呢?  当客户发送一条SQL语句给服务器后,服务器总是需要校验SQL语句的语法格式是否正确,然后把SQL语句编译...

    第40天:JAVA安全-JWT安全及预编译CASE注入等1

    1、用户端登录,用户名和密码在请求中被发往服务器 2、(确认登录信息正确后)服务器生成 JSON 头部和声明,将登录信息写入 JSON 的声明中(通常不 3、服

    安装pyltp相关的包(64位预编译版本和vc++14.0)

    快速正确的安装pyltp,你一定需要这几个包:vc++14.0,64位的pyltp预编译包(python35和python36)

    openldap2.4.39 修正版,可用nmake编译

    但是,该源码中的工程文件中,预处理器的宏定义有错,不能正确生成dll版本。因此,我精简了该源码,并校正了其中的宏定义,编写了Nmake的makefile文件。 修正http://download.csdn.net/detail/travel981cn/7152647...

    Openscad Seamless Compiler:预编译 openSCAD 文件以包含在线模块-开源

    预编译 openSCAD 文件以包含在线模块。 在 GPLv2 下分发 Github:https://github.com/Phaiax/openscad-seamlesslib-client Github 上的服务器代码:https://github.com/Phaiax/openscad-seamlesslib-client

    installPlayStation3Eye:适用于 NVIDIA Jetson TK1 的 PlayStation 3 Eye 相机的预编译模块

    在 NVIDIA Jetson TK1 上为 PlayStation 3 Eye 摄像头安装预编译驱动程序。 此存储库包含为 PlayStation 3 Eye 摄像头编译的驱动程序 (gspca_ov534.ko),为 Linux 下的 NVIDIA Jetson TK1 开发套件编译,适用于 ...

    lambda-packages:各种流行的python库,已预编译为与AWS Lambda兼容

    预编译为与AWS Lambda兼容的各种流行库。 目前包括(至少Python 2.7)对以下内容的支持: 加密 cffi 密码学 datrie_extended LXML 三香 MySQL的Python mysql客户端 麻木 OpenCV 枕头(PIL) psycopg2 ...

    基于C++的编译原理词法分析器.zip

    - 使用单元测试来验证词法分析器的正确性。 - 编写文档,记录设计决策和实现细节,便于项目维护和他人理解。 通过实现C++词法分析器,开发者可以深入理解编译器的工作原理,提高C++编程技能,并为进一步学习编译原理...

    嵌入式SQL编程 附有操作说明 student

     b) 在文件对话框中选择正确路径,选定预编译输出生成的文件student.c,单击“打开”按钮,即将这些文件加入工程。  2) 将运行库文件加入工程  a) 菜单Project / Add To Project 项 / Files 项;  b) 将文件...

    ASP.NET编译执行常见错误及解决方法汇总

    引起 解决: 方案一: 在.aspx文件头中加入这句: <%@ Page validateRequest=”false” %> 方案二: 修改web.config文件: <configuration> <system> ”false”> </system> </configuration

    Delphi开发入门教程简述.docx

    在数据库查询时尽量使用预编译(Prepared Statements)来提升查询性能。 避免不必要的内存分配和释放,合理使用string类型和动态数组。 对频繁使用的资源进行缓存处理。 用户界面设计: 使用布局管理器(如...

    解析C语言与C++的编译模型

    首先简要介绍一下C的编译模型: ...为了在减少内存使用的情况下实现分离编译,C语言还支持”隐式函数声明”,即代码在使用前文未定义的函数时,编译器不会检查函数原型,编译器假定该函数存在并且被正确调用,

    如何在C++中添加头文件,c++万能库头文件

    避免重复包含:为了避免同一个头文件被多次包含,通常会在头文件的开头和结尾使用预处理器指令来防止重复包含 编译程序:最后,使用C++编译器编译你的程序。编译器会处理所有的#include指令,并将包含的头文件内容...

    mysqldumpsplitter:将mysqldump的输出分割为任何最大大小的文件。 保持语法正确,即使使用扩展插入也是如此

    MySQLDump拆分器将mysqldump的输出分割为任何最大大小的文件。...编译中预编译的二进制文件可以在/ bin中找到,并且当前提供给以下平台: OS X 如果没有针对您的平台的预编译二进制文件,则必须自己对其

    openldap-2.4.39 for PHP MSVC2010工程文件版

    但是,该源码中的工程文件中,预处理器的宏定义有错,不能正确生成dll版本。因此,我精简了该源码,并校正了其中的宏定义,编写了Nmake的makefile文件。 请注意,libldap的dll,采用的liblber的静态库,因为你必须...

    数据库实验Proc源码

    大型数据库技术Proc*C程序设计部分实验源码,预编译、编译通过,运行能产生正确结果。

    libsodium.js:libsodium编译为Webassembly和纯JavaScript,并带有方便的包装器

    libsodium.js概述使用将密码库编译为WebAssembly和纯JavaScript,并具有自动生成的包装程序,以使其易于在Web应用程序中使用。 完整的库重188 KB(最小化,压缩,包括纯JS + WebAssembly版本),可以在Web浏览器和...

    嵌入式Linux开发环境及其在ARM上的移植.ppt

    gcc编译器执行过程:预处理(预编译,Preprocessing)编译(Compilation)汇编(Assembly)链接(Linking) 嵌入式Linux内核功能结构图 嵌入式Linux内核裁剪方法 Bootloader就是在操作系统内核运行之前运行的一段小...

Global site tag (gtag.js) - Google Analytics