预编译头文件PCH

深入理解预编译头文件(PCH):大型项目的编译加速器 PCH(Precompiled Header)是编译优化的一种技术,它通过将一部分头文件在编译时提前编译成二进制文件,从而避免每次编译时都重新处理相同的头文件内容。预编译头文件通常包含不常变化、在多个源文件中被引用的头文件。常见的例如标准库头文件、第三方库头文件等。生动比喻假设你在做一个学校的报告,每次写报告时,你都需要查阅参考书中的相同章节,如果每次都重新翻阅这些章节,既浪费时间又低效。预编译头文件就像是提前把这些常用的章节抄写下来,下一次写报告时直接用已经准备好的内容,节省了大量的时间。 阅读详情

一、预编译头文件使用经验:

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

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++ 预编译头文件(Precompiled Header,PCH) 后续编译时,如果其他源文件中也包含了同样的预编译头文件,编译器会直接使用之前生成的二进制文件,而不是重新预处理一遍头文件。它的原理是先将一些常用的头文件预处理,生成一个二进制文件(通常是.pch文件),然后在后续的编译中,直接引用这个二进制文件,避免了重复的预处理过程,从而提高了编译速度。例如,如果你预编译了“stdafx.h”头文件,你就会得到一个预编译头文件,每次你包含“stdafx.h”头文件时,编译器都会自动搜索名为“stdafx.h.gch”的预编译头文件。 阅读详情

相关推荐

预编译头文件(PCH)实战指南:从配置到跨平台优化

本文详细介绍了预编译头文件(PCH)作为编译加速器的原理与实战配置。通过对比Visual Studio和CMake两种主流构建工具下的具体设置步骤,并结合性能实测数据,展示了PCH如何大幅缩短大型C++项目的编译时间。文章还深入探讨了跨平台优化策略、常见陷阱规避以及模块化PCH等高级技巧,帮助开发者高效利用这一关键技术提升开发效率。

rose2的博客 944

关于预编译头以及StdAfx.cpp的解惑

预编译头就是将程序的头文件部分编译成一个二进制中间文件,提高整个工程的编译效率,一般以.pch格式存储。       1. 在编译器重已经采用了时间戳的方式,为何还需要预编头呢?         对.obj加以时间戳的方式,可以根据时间戳来决定哪些文件需要重新编译,从而提高效率。但重新编译这个文件,包括这个文件的头文件里的信息和预处理(指头文件中的预处理)都重新进行一遍,而预编译头正是解决了这

一个程序员的修炼之路 7485

C/C++编译优化技巧:预编译头文件(PCH)使用方法

C/C++ 预编译头文件 (PCH)

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 5495

stdafx.h和pch.h头文件说明

stdafx.h和pch.h头文件说明

cnds123的专栏 2973

加速你的 C++ 编译:使用预编译头文件(PCH)

幸运的是,C++ 提供了一种简单但有效的方法来加快编译速度:使用预编译头文件(PCH)。通过使用预编译头文件,我们可以避免重复编译常用头文件和声明,从而大大加快编译速度。在大型项目中使用预编译头文件是一个非常好的习惯,希望这个小技巧能够帮助你加速 C++ 编译过程。然后,我们将创建一个名为“pch.h”的预编译头文件,包含常用头文件,并将其编译为一个名为“pch.pch”的二进制文件。参数指定要包含的预编译头文件,“-Winvalid-pch”参数表示如果找不到预编译头文件就会出现错误。

James_CODER的博客 778

Windows系统3D Gaussian Splatting环境搭建全攻略:从零开始到成功运行

本文详细介绍了在Windows系统上搭建3D Gaussian Splatting环境的完整流程,包括CUDA 12.6安装、Anaconda环境配置、代码获取与依赖安装等关键步骤。针对Windows平台特有的环境配置问题,提供了实用的解决方案和常见错误排查方法,帮助开发者快速实现3D Gaussian Splatting的成功运行。

weixin_30832143的博客 452

afxwin.h 与stdafx.h

(1)Standard Application Frame Extend没有函数库,只是定义了一些环境参数,使得编译出来的程序能在32位的操作系统环境下运行。Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻了。为避免这种浪费,App...

weixin_30374009的博客 575

机器学习入门指南:Jupyter Notebook实战

对于机器学习工程师而言,他们更擅长的是算法、模型、数据探索的工作,而对于工程化的能力则并不是其擅长的工作。Jupyter Notebook生成PMML文件1​​​​​​​。Jupyter Notebook生成PMML文件2​​​​​​​。PySpark Notebook建模 -折线图​​​​​​​。TensorFlowNotebook建模​​​​​​​。R Notebook建模 - 散点图​​​​​​​。PySpark Notebook建模​​​​​​​。R Notebook获取训练数据集​​​​​​​。

datacreating的博客 1975

预处理和预编译、预编译头文件stdafx.h和pch.h

快速搞懂预处理和预编译的区别,以及预编译头文件的作用,还有VS项目中常见的stdafx.h和pch.h。

qq_40306845的博客 1850

Silvaco光电探测学习笔记(一)——有关响应和暗电流

习惯用md记笔记,索性发出来,一是为了在线同步,二是希望能帮到需要的人。

qq_41584406的博客 8012

电脑版微信多开,最详细教程没有之一

首先桌面任意的位置右键新建文本文档输入如下代码: TASKKILL /F/IM WECHAT.EXE start " " "D:\Program Files (x86)\Tencent\WeChat\WeChat.exe" start " " "D:\Program Files (x86)\Tencent\WeChat\WeChat.exe" ...

大超子 4390

预编译的头文件 pch.h

预编译的头文件 在 Visual Studio 中创建新项目时,名为pch.h的预编译头文件将添加到项目中。(在 Visual Studio 2017 及更早版本中,该文件称为stdafx.h。)该文件的目的是加快构建过程。任何稳定的头文件,例如标准库头文件,如,都应该包含在此处。预编译的头文件只有在它或它包含的任何文件被修改时才会被编译。如果您只对项目源代码进行更改,则构建将跳过对预编译头文件的编译。<vector> 预编译头文件的编译器选项是/Y。在项目属性页中,选项位于Configur

needle的博客 7738

CMN-700组件全解析:从XP路由器到HN-F主节点的实战配置指南

本文深入解析Arm CMN-700片上网络IP的核心组件与实战配置。重点剖析了XP网格路由器的拓扑规划与CHI通道管理,以及HN-F全一致性主节点在维护缓存一致性、管理SLC和地址映射中的关键作用。通过一个12×12网格的配置案例,为硬件工程师提供了从组件布局、地址映射到性能调优的系统级设计指南。

weixin_29313423的博客 282

关于.pch 预编译头文件

预编译头文件 预编译头文件(一般扩展名为.PCH),是把一个工程中较稳定的代码预先编译好放在一个文件(.PCH)里.这些预先编译好的代码可以是任何的C/C++代码--甚至可以是inline函数,只它们在整个工程中是较为稳定的,即在工程开发过程中不会经常被修改的代码.为什么需要预编译头文件?一言以蔽之:提高编译速度.一般地,编译器以文件为单位编译,如果修改了一工程中的一个文件则所有文件都要重新编译

ch977的专栏 764

智慧加油站小程序数据库设计文档

【代码】智慧加油站小程序数据库设计文档。

低代码布道师的博客 1402

特征选择/筛选方法总结

作者:jliang https://blog.youkuaiyun.com/jliang3 1.特征选择介绍 1)特征分类 相关特征:对于学习任务(例如分类问题)有帮助,可以提升学习算法的效果; 无关特征:对于我们的算法没有任何帮助,不会给算法的效果带来任何提升; 冗余特征:不会对我们的算法带来新的信息,或者这种特征的信息可以由其他的特征推断出; 2)特征选择的目的 对于一个特定的学习算法...

jliang3的博客 8万+

预编译头文件.PCH

<br /><br />预编译头文件(一般扩展名为.PCH),是把一个工程中较稳定的代码预先编译好放在一个文件(.PCH)里.这些预先编译好的代码可以是任何的C/C++代码--甚至可以是inline函数,只它们在整个工程中是较为稳定的,即在工程开发过程中不会经常被修改的代码. <br /> <br />为什么需要预编译头文件?一言以蔽之:提高编译速度.一般地,编译器以文件为单位编译,如果修改了一工程中的一个文件则所有文件都要重新编译,包括头文件里的所有东西(eg.Macro宏,Preprocessor预处理

Jesse的专栏 720

STM32串口控制LED灯的亮灭

STM32中的串口控制LED灯的亮灭,分为两种方式,一种是直接发送数字0和1来控制灯的亮灭,另一种是通过发送字符串来控制。 我所使用的开发板主控芯片是STM32F401RET6,主频84MHz, 首先要进行串口的初始化: /* 函数功能:串口的初始化 函数名:Usart_Init 返回值:无 参数:u32 brr 备注: USART1_TXD->PA9 USART1_RXD->PA10 */ void Usart_Init(u32 brr) { float div; u16 div

博客 2万+

CMake预编译头文件终极指南:共享PCH与目标特定PCH的配置对比与性能优化

在C++大型项目开发中,编译时间往往成为影响开发效率的关键因素。CMake预编译头文件(PCH)技术通过预编译常用头文件,显著减少重复编译时间,是提升构建性能的重要利器。本文将深入解析CMake中预编译头文件的配置方法,重点对比共享PCH与目标特定PCH的使用场景与性能差异。 ## 什么是CMake预编译头文件? 预编译头文件是CMake提供的一项高级功能,它允许开发者在构建过程中预先编译常用

gitblog_00782的博客 649

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

预编译头文件.PCH文件

预编译头文件(一般扩展名为.PCH),是把一个工程中较稳定的代码预先编译好放在一个文件(.PCH)里.这些预先编译好的代码可以是任何的C/C++代码--甚至可以是inline函数,只它们在整个工程中是较为稳定的,即在工程开发过程中不会经常被修改的代码. 为什么需要预编译头文件?一言以蔽之:提高编译速度.一般地,编译器以文件为单位编译,如果修改了一工程中的一个文件则所有文件都要重新编译,

u014023993的专栏 670

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

预编译头文件pch

所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的 C/C++代码--------甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。注意生成预编译头文件是很耗时间的。同时你得注意预编译头文件通常很大,...

diexiequ0204的博客 299

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Qt-预编译头文件PCH

PCH极大提高编译速度。

FloMoney的博客 963

VC预编译头文件PCH

问题提出: 今天在VC6.0中咕哝个程序,遇到如下提示: Cannot open precompiled header file:'Debug/password.pch' No such file or directory 所谓pch,即 precompiled header  解决方法: 你可以打开StdAfx.h,然后F7.看看正常没~即全部组建 在菜单的“工程”--

1 919

Xcode7 建立 pch 文件 (预编译头文件)

Query: pch 文件 干嘛的? 百度百科:pre-Compile Header(预编译头文件),由编译器在建立工程时自动生成; 其中存放有工程中已经编译的部分代码; 在以后建立工程时不再重新编译这些代码。 经过实践后我的认知:pch文件经过加载后里面的内容会预先执行。 Example:pch文件里面引用了<UIKit/UIKit.h>头文件后,我新建立的类如果需要引入UIKit的头文

Smile in a sunny day 1522

预编译头文件 .pch

VC预编译PCH文件预编译头文件(一般扩展名为.PCH),是把一个工程中较稳定的代码预先编译好放在一个中间形式的文件(.PCH)里,编译器可以更加快捷的使用这个文件,减少编译时间。.这些预先编译好的代码可以是任何的C/C++代码--甚至可以是inline函数,只它们在整个工程中是较为稳定的,即在工程开发过程中不会经常被修改的代码.为什么需要预编译头文件?一言以蔽之:提高编译速度.一般地,编译器以文

366

Aurora Engine 游戏引擎入门 06(设置预编译头文件pch)

#1 C++预编译头文件好处 #2 创建预编译头文件 #3 在premake中设置预编译 #4 设置项目中的所有cpp包含pch头 #1 C++预编译头文件好处 项目的头文件可以统一进行管理,方便之后的查询和拓展 之前每个*.cpp都需要引入头文件,很多需要引入一样的头文件,没有这个必要 加速项目的编译,如果项目有很多重复包含的头文件,只需要进行一次编译就可以 // aopch.h /* * *.pch 头文件的概念 * 所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常.

Unity3d 攻城师一枚 428
上一篇: 拷贝构造函数和赋值操作符operator=分别在什么时候被调用?
下一篇: 如何理解LPCTSTR、TCHAR
geeeeeeee
博客等级 码龄23年 36粉丝 67原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值