c++中 预编译头文件PCH
转载:https://blog.csdn.net/lovemysea/article/details/74858430
一、预编译头文件使用经验:
如果预编译头文件被正确使用时,它确实大大提高我们编程的效率(你工作中,有多少时间是在等编译完成?很多吧,这个时候一般都很无聊,无奈,浪费时间)。但是他太容易用错了. 下面是几种常见的错误用法.
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!
二、预编译头文件概念、作用
1、概念
所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的C/C++代码--------甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。注意生成预编译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有6-7M大。注意及时清理那些没有用的预编译头文件。
也许你会问:现在的编译器都有Time stamp的功能,编译器在编译整个工程的时候,它只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过的文件。那么为什么还要预编译头文件呢?答案在这里,我们知道编译器是以文件为单位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有头文件中的东西(.eg Macro, Preprocessor )都要重新处理一遍。VC的预编译头文件保存的正是这部分信息。以避免每次都要重新处理这些头文件。
2、预编译头的使用:
要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件)
想必大家都知道 StdAfx.h这个文件。很多人都认为这是VC提供的一个“系统级别”的,编译器带的一个头文件。其实不是的,这个文件可以是任何名字的。我们来考察一个典型的由AppWizard生成的MFC Dialog Based 程序的预编译头文件。(因为AppWizard会为我们指定好如何使用预编译头文件,默认的是StdAfx.h,这是VC起的名字)。我们会发现这个头文件里包含了以下的头文件:
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation classes
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
#include <afxcmn.h>
这些正是使用MFC的必须包含的头文件,当然我们不太可能在我们的工程中修改这些头文件的,所以说他们是稳定的。
那么我们如何指定它来生成预编译头文件。我们知道一个头文件是不能编译的。所以我们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件里只有一句代码就是:#include “Stdafx.h”。原因是理所当然的,我们仅仅是要它能够编译而已―――也就是说,要的只是它的.cpp的扩展名。我们可以用/Yc编译开关来指定StdAfx.cpp来生成一个.pch文件,通过/Fp编译开关来指定生成的pch文件的名字。打开project ->Setting->C/C++ 对话框。把Category指向Precompiled Header。在左边的树形视图里选择整个工程,在图中我们的Project Options(右下角的那个白的地方)可以看到 /Fp “debug/PCH.pch”,这就是指定生成的.pch文件的名字,默认的通常是 <工程名>.pch
然后,在左边的树形视图里选择StdAfx.cpp,这时原来的Project Option变成了 Source File Option(原来是工程,现在是一个文件,当然变了)。在这里我们可以看到 /Yc开关,/Yc的作用就是指定这个文件来创建一个Pch文件。/Yc后面的文件名是那个包含了稳定代码的头文件,一个工程里只能有一个文件的可以有YC开关。VC就根据这个选项把 StdAfx.cpp编译成一个Obj文件和一个PCH文件。
在命令行里,我们可以看到/Yu"stdafx.h" /Fp"Debug/DepModify.pch"
然后我们再选择一个其它的cpp文件来看看,在这里,Precomplier 选择了 Use ………一项,头文件是我们指定创建PCH 文件的stdafx.h文件。事实上,这里是使用工程里的设置,(如图1)/Yu”stdafx.h”。
这样,我们就设置好了预编译头文件。也就是说,我们可以使用预编译头功能了。
以下是注意事项:
1):如果使用了/Yu,就是说使用了预编译,我们在每个.cpp文件的最开头(我强调一遍是最开头)包含 你指定产生pch文件的.h文件(默认是stdafx.h)不然就会有问题。如果你没有包含这个文件,就告诉你Unexpected file end. 如果你不是在最开头包含的,你自己试以下就知道了,绝对有很惊人的效果…
2)如果你把pch文件不小心丢了,根据以上的分析,你只要让编译器生成一个pch文件就可以了。也就是说把stdafx.cpp(即指定/Yc的那个cpp文件)从新编译一遍就可以了。当然你可以傻傻的 Rebuild all。简单一点就是选择那个cpp文件,按一下Ctrl + F7就可以了。
c++中 预编译头文件PCH的更多相关文章
- 预编译头文件pch
1. 预编译头文件 作用:提高编译效率.预编译头文件(扩展名为.PCH),是为了提高编译效率而使用的一种方法,把一个工程中较稳定的代码预先编译好放在一个文件(.PCH)里.避免每次编译 ...
- c++ 中预编译头文件名 pch.h
转载:https://www.it-swarm.asia/zh/c++/%e6%88%91%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8includepchh%e2%80%9 ...
- VS2010遇到fatal error C1083: 无法打开预编译头文件:“xxx.pch”: No such file or directory
对C++和VS2010非常不熟悉,但是无奈赶着项目,只能看了点基础就上手,然后就碰到这个问题了. 原因分析: http://bbs.csdn.net/topics/340191697?page=1 编 ...
- fatal error C1083: 无法打开预编译头文件:“Debug\a.pch”:No such file or directory
一.解决方法 右键点击你创建的项目,选择“属性标签”点击属性,弹出“项目属性页”,在左侧找到以下位置 配置属性 --> C/C++ --> 预编译头,并选择它:在右边的菜单中选择 “ ...
- ++ fatal error C1083: 无法打开预编译头文件:“.\Debug\router.pch”
一.出现此错误首先检查:stdafx.cpp文件上右键——属性,预编译头选“创建”,其它cpp选“使用”. 二.如果是采用这样的设置,还是有错误,重新生成解决方案,重新调试. 三.实在不行的话,步骤/ ...
- VC中关于预编译头文件的概括,以及无法打开预编译头文件的错误解决
1.预编译头文件 在VC中编译器一般都是以文件为单位进行编译,如果修改了工程中的一个文件,那么将导致所有文件都要从新编译,这样的编译将耗费很长时间.为了提高编译速度,将那些不常被修改,比较稳定,文件单 ...
- 通过预编译头文件来提高C++ Builder的编译速度
C++ Builder是最快的C++编译器之一,从编译速度来说也可以说是最快的win32C++编译器了.除了速度之外,C++builder的性能也在其它C++编译器的之上,但许多Delphi程序员仍受 ...
- Qt使用预编译头文件Using Precompiled Headers(提升10倍以上)
预编译头文件是被很多编译器用来编译稳定的代码以及将编译好的稳定代码存储在二进制文件中用于提升编译性能.在随后的编译中,编译器将加载存储状态继续编译指定的文件.每一个随后的编译将更快,因为稳定的代码不需 ...
- error C1853: “Debug\BigBuffer.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
<pre id="best-content-1299104064" mb-10"="" style="font-size: 14px; ...
随机推荐
- Log4Net + Log4Mongo 将日志记录到MongoDb中
实现: 将日志保存在MongoDb中: 自定义日志字段: 日志按照日期拆分集合: 第一部分:将日志保存在MongoDb中 新建控制台程序Log4MongoDemo 通过NuGet安装Log4Net ( ...
- unity坑-编译错误
问题: 项目里面有一个 StreamReader来读取一个文件,使用OpenText() 方法. 但是UNITY却提示 StreamReader类不包含OpenText()方法,并且也没有找到扩展方法 ...
- Activiti7 获取资源信息及其查询流程历史信息
获取资源信息 /** * 获取资源信息 * * @throws IOException */ @Test public void getProcessResources() throws IOExce ...
- Mysql执行计划(大章)
Mysql的执行计划 执行计划是啥? 使用explain关键字可以模拟优化器执行SQL查询语句,从而知道Mysql是如何处理你的SQL语句的.分析你的查询语句或者表结构的性能瓶颈 语法 explain ...
- MySQL中如何分析查询语句
Oracle中有explain for,mysql中也有同样的功能,那便是explain,举例如下: mysql> explain select (case (select count(*) f ...
- IDEA左侧文件目录不见了,帮你找回来!
前几天不知道什么操作,把IDEA左侧项目的目录给弄没了,如下图,在百度上搜索了不少,就是没有效果,很是头疼,巧的是,今天琢磨了一下,又给弄回来了,所以在此记录一下,以后再给弄没了,就知道了,同时也算是 ...
- 通达OA任意用户登录漏洞复现
前言 今年hw挺火爆的,第一天上来就放王炸,直接搞得hw暂停 昨天晚上无聊,复现了一下通达oa的洞,也有现成的exp可以使用,比较简单 0x00 漏洞概述 通达OA是一套国内常用的办公系统,此次发现的 ...
- C# 读取 ttf字体文件里的 Unicode
因为爬虫要解析 򈃌这种字体编码的值,下载到一个ttf文件,用百度字体编辑器 打开,可以看到每个字符对应的Unicode (数字下方 $23.$2A...这些), 我需要拿到这些映 ...
- Windows10 安装 CUDA + cuDNN + pyTorch
2020/5/29 在 windows10 上面安装 CUDA 和 cuDNN 0.简单了解一下 CUDA 和 cuDNN 1)什么是 CUDA CUDA(ComputeUnified Device ...
- Spring基于XML的IOC环境搭建及入门
一.使用Maven构建Java项目 * 项目目录结构 1. 在sun.service包下创建UserDao接口和接口实现类: UserDao接口: package sun.service; /** * ...