加快编译速度,再谈C/C++预编译技术的使用

如何分析和提高大型项目(C/C++)的编译速度? 对于C/C++代码通常来说整个构建过程分为以下几个主要部分:在编译耗时分析中也就应该对以上几个主要方面分别进行时间维度的评估,逐渐细化分析粒度确定时间瓶颈,直到某个文件、某个函数、某个模板才能有针对性地制定从宏观的构建系统到微观的文件、符号的具体优化方案。gcc -E选项可以得到预处理后的结果,扩展名为.i 或 .ii。一般来说对预处理阶段的分析尤为重要,因为预处理完了之后的中间文件才是真正编译过程的输入。预处理后文件的体量大小直接影响了后续阶段各个部分的时间消耗水平。由于C/C++编译特点的影响,每个编译 阅读详情

最近新参加的一项目是C++项目,新项目使用的原来老项目的代码来作开发,两个项目不管是Windows还是Linux都是没使用预编译技术,导致编译时间很长。

我发现我参加工作以来经历过几个别人已经写成型的C++项目,包括Windows的、Linux的以及跨Windows与Linux的,这些项目无一例外的都没有使用预编译技术来加快编译,导致整个项目的编译时间很长,有十几二十分钟的,更有三四十分钟,甚至更长时间的。对于这样长的编译时间,我无一例外的都是无法忍受,这很影响开发效率和我的心情,也不知道之前参与这些项目的开发人员是如何能忍受这样的编译时长的。既然自己参与到项目中了,无法忍受那就努力改变它,使用预编译技术来加快项目的编译速度,缩短编译时间。

这几个C++项目经过我对项目配置的一番修改,都有效地加快了编译速度,大幅地减少了编译时间,极大地提高了开发效率。原来需要三四十分钟的优化后变为4,5分钟;十几二十分钟的优化后变为1,2分钟,提升之明显,所以在此再写一博文来详细介绍一下相关设置,希望能帮助大家节省开发时间,提高开发效率。

这里之所以说是再谈,是因为前面有写过或者转过关于预编译技术的博文:
在VisualGDB中配置预编译头加快编译速度
使用 GNU CC 的预编译头文件加快编译速度
C/C++通用Makefile

Visual C++中使用预编译技术

其实在Windows平台,Visual C++中使用预编译技术是非常方便的,也很简单;相对而言,Linux下GCC使用预编译技术则要复杂许多。

我们平常在新建一个项目时,Visual C++会默认使用预编译技术来帮助我们加快编译速度。

下图是我们使用Visual C++新建的一个控制台项目时的向导,我们可以看到默认是勾选了“预编译头”的。
在这里插入图片描述
在新生成的项目中有如下文件
在这里插入图片描述
我们可以看到有一个stdafx.h和stdafx.cpp,这两个文件就是预编译技术需要使用的相关文件。只要我们把系统头文件以及项目引用比较多的头文件放进stdafx.h中,就可以加快编译了。
Visual C++是如何设置的呢?可以打开项目属性页面,看如下图所示配置
在这里插入图片描述
可以看到整个项目都使用了预编译头。要使用预编译头,就需要先创建预编译头,可以查看stdafx.cpp文件的属性
在这里插入图片描述
我们可以看到,这里预编译头不是“使用”,而是“创建”。整个项目在编译时,是最先编译stdafx.cpp来预编译stdafx.h文件中所包含的头文件,会生成一个预文件文件,比如VS2015生成的是一个ipch文件,生成后该文件后,在编译项目中的其它文件时,则会优先使用该文件中的解析结果。

上面这种设置适合新项目,需要在项目所有源文件(非头文件)中第一个包含预编译头文件(stdafx.h)。当然,stdafx.h和stdafx.cpp这两个文件名都可以任意取,关键是需要在项目中设置为使用预编译头,并拿一个源文件来创建预编译头即可。

如果遇到老项目,项目中已经有成百上千个文件了,这些源文件不一定是第一个包含预编译头文件的,也许根本就没有统一包含某一个头文件。此时我们只需要设置为让项目所有源文件都强制包含预编译头文件即可:
在这里插入图片描述
这样设置后,老项目也可以尽情享受预编译技术带来的加速了。

Linux下GCC使用预编译技术

在Linux下常常使用Makefile来编译项目,可以直接写Makefile,也可以使用其它工具来生成Makefile,比如cmake,qmake等等。

Makefile

如果是手动编写Makefile,如何添加预编译头,可以参考:
使用 GNU CC 的预编译头文件加快编译速度
C/C++通用Makefile

老项目添加预编译
如果是老项目,我们只需要在使用 GNU CC 的预编译头文件加快编译速度一文所言的CFLAGS和CXXFLAGS宏后添加
-include Prec.h
强制包含预编译头文件即可(Prec.h为预编译头文件)。

VisualGDB

参见:
在VisualGDB中配置预编译头加快编译速度

CMake

cmake作为一个开源的跨平台构建工具,由于其功能强大且简单易用,越来越受到大家的青睐,目前很多开源项目都使用cmake来构建。

使用cotire

cmake在3.16之前并不直接支持预编译,但是有一个开源项目cotire对cmake提供了预编译支持。

1.首先把cotire.cmake放在项目的根目录(顶层目录)
2.然后在项目根目录的CMakeLists.txt中添加如下配置:

set (CMAKE_MODULE_PATH “.”)
include(cotire)

3.在设置链接的CMakeLists.txt中添加:

set_target_properties(MyTarget PROPERTIES COTIRE_CXX_PREFIX_HEADER_INIT “Prec.h”)
cotire(MyTarget)

其中,MyTarget是项目链接的目标文件,Prec.h是预编译头文件。

使用target_precompile_headers

在CMake 3.16之后添加了对预编译的直接支持:

target_precompile_headers(
<INTERFACE|PUBLIC|PRIVATE> [header1…]
[<INTERFACE|PUBLIC|PRIVATE> [header2…] …])

参见:target_precompile_headers

但是对生成的Visual Studio项目无效,貌似只对Makeilfe类的有效,其它的没测试过。
注意:这个命令必须在指定了目标之后使用,即需要在add_executable() 或者add_library()后

The command adds header files to the PRECOMPILE_HEADERS and/or > INTERFACE_PRECOMPILE_HEADERS target properties of . The named must have been created by a command such as add_executable() or add_library() and must not be an ALIAS target.

示例:

cmake_minimum_required(VERSION 3.16.0)
project(main VERSION 0.1.0)

add_executable(main main.cpp)

target_precompile_headers(main PRIVATE prec.h)

祝玩得开心!

C++开发中stdafx.h和stdafx.cpp的作用 通过合理使用预编译头,大型项目的编译时间可以从分钟级缩短到秒级,尤其在频繁增量编译时效果显著。在传统的C++项目开发中(尤其是使用Microsoft Visual Studio时),,特别是在大型项目中。 阅读详情

相关推荐

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

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

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

CMake中target_precompile_headers的使用

CMake中target_precompile_headers的使用

网络资源是无限的 6051

加快QT工程编译速度

Qt Creator自带了多核编译工具支持,老版本没有默认开启,需要自己在项目中进行配置才能生效。新版本有可能默认开启了。 新版本:菜单栏->工具-> 选项->Kits->构建套件(kit) 老版本:菜单栏->工具-> 选项->构建与运行->构建套件(kit)

草上爬的博客 9734

【CMake 之 编译优化手段 】:掌握预编译头文件 target_precompile_headers

在深入探讨 **预编译头文件**(Precompiled Headers, PCH)之前,我们需要理解它们的基础概念。在C++编程中,头文件经常包含大量的定义和声明,它们在每次编译时都需要被处理。预编译头文件技术的出现,就是为了解决这一重复性工作。通过这种技术,编译器可以在第一次编译头文件时,保存一个预编译版本,后续编译则直接使用这个预编译版本,从而节省时间。

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

C++预编译技术详解

C++预编译技术详解,真心不错,贡献。高级必会。

一图文带您认识磁编码器

磁编码器是以磁电原理技术生产的编码器。 磁编码器工作原理: 当电流通过一个位于磁场中的导体的时候,磁场会对导体中的电子产生一个垂直于电子运动方向上的的作用力,从而在垂直于导体与磁感线的方向上产生电势差。 如果让施加在这个导体上的磁场以电流流经路径为轴线,按照上图箭头所示的方向旋转,那么这个霍尔电势差就会因为磁场与导体之间角度的改变而发生变化,而这个电势差的变化趋势,与之前一文中次级线圈旋转时的输出电压一样,是一条正弦曲线。因此,基于这个通电导体两侧的电压,就可以反推计算出磁场旋转的角度了。 .

encoder_yang的博客 2万+

CMake教程系列-04-编译相关函数

编译过程与链接过程需要向编译器及链接器传入不同的参数,而这些参数分为以下几类:此函数向目标添加编译选项, eg: 需要注意的是,如果要设置c / c++ 标准,不仅可以使用该函数添加 -std=STANDARD,还可以且更推荐设置以下两个cmake预设宏的值: 2.target_compile_definitions 此函数专门向目标添加预设宏声明及定义。 eg: 3.target_compile_features 此函数专门向目标设置c / c++版本。当然,你仍然可以选择第一个函数中的两种做

喜欢打篮球的普通人 1994

Ubuntu 24.04.3 LTS 安装 OpenClaw 图文版

OpenClow安装指南

qq_17204557的博客 2552

Qt 预编译头文件(precompiled headers) 加快编译速度

预编译头文件: precompiled headers, 将不经常改动的代码编译成二进制文件, 在之后每次编译的时候可会直接调用这些预编译头文件的二进制文件, 实现加快编译速度.

wangyu0354 5704

STM32H750实战:如何用CubeMX配置NAND Flash时序(附常见问题排查)

本文详细解析了STM32H750通过CubeMX配置NAND Flash时序的实战技巧,包括硬件连接、时序参数计算与优化策略,以及常见问题如RGB屏幕干扰、多片选冲突的解决方案。特别针对NAND Flash的时序配置和抗干扰设计提供了实用代码示例和优化建议,帮助开发者提升系统稳定性和性能。

weixin_29176179的博客 365

jetson agx orin开箱及接口介绍

jetson agx orin开箱及接口介绍

qq_58728069的博客 1万+

加快C++代码的编译速度方法

Visual Studio实现多核并行编译: 1.在“ClassView”中选取某项目的“Properties(属性)” 。 2.在之后打开的对话框中,左侧选择 “C/C++”->“General(常规)”中将“ Multi-processor Compilation(多处理器编译)”打开。 3.接着,“C/C++”->“Code Generation(代码生成)”中将“Enable ...

qq_23350817的博客 3362

PyTorch实战:5步搞定Res2Net图像分类模型(附完整代码)

本文详细介绍了如何使用PyTorch在5步内构建高性能Res2Net图像分类模型,包括环境配置、核心模块实现、完整网络架构搭建、训练流程优化及模型部署技巧。Res2Net通过多尺度特征融合机制显著提升图像分类性能,附完整代码帮助开发者快速实践。

java5的博客 1024

使用 GNU CC 的预编译头文件加快编译速度

使用 GNU CC 的预编译头文件加快编译速度 既使用过 Microsoft® Visual C++® 又使用过 GNU CC 的网友一定会感受到两者编译速度的差异,尤其是对于 wxWidgets这样头文件内容多的软件。Microsoft® Visual C++® 能够有很高编译效率的原因是其支持“预编译头文件”(Pre-Compiled Header, PCH

O.Nixie的专栏 1184

数字摄影与摄像中的图像信号处理器(ISP):流程与经典算法详解

图像信号处理器(Image Signal Processor, ISP)是现代数字成像系统(如智能手机、数码相机、网络摄像头等)中的核心组件,扮演着将图像传感器(如CMOS或CCD)捕获的原始光电信号转换为高质量、可供观看或进一步处理的数字图像的关键角色。在数字摄影和摄像的整个链路中,光线首先通过镜头(Lens)聚焦到图像传感器上,传感器将光信号转换为模拟电信号,随后经过模数转换(A/D转换)变为原始的数字图像信号。

qq_44682523的博客 3727

Xilinx FPGA ICAP原语实现多重配置

众所周知,常见的FPGA通常为SRAM结构,固件程序一般存放在外置的串行Flash中,比如SPI Flash,M25P16或N25Q128等。 FPGA启动时,一般先从SPI起始地址开始加载数据到内部的SRAM,加载完成、校验通过则会直接运行。 那么有没有可能在SPI Flash中存放两个或多个FPGA固件呢?

whik1194的博客 4614

“C1083 无法打开预编译头文件”的处理与深入理解预编译头文件

VS生成的项目结构有一些杂乱,所有代码文件都堆放在一起,于是对齐进行了整理,但是却出现了“C1083 无法打开预编译头文件”的错误。因此研究了一下应该如何规范地使用预编译头,达到加快项目编译速度的目的。

qq_46314975的博客 1308

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++开发基础之预编译头文件 stdafx.h的作用

stdafx.h 是一个预编译头文件,在 Visual C++ 中被广泛使用。它包含了一组常用的头文件,这些头文件在整个项目中会被频繁使用。通过预编译头文件,编译器可以事先处理这些头文件,并将其保存在一个二进制文件中,以加快后续的编译过程。

dotnet研习社 3286

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

linux 预编译头,使用 GNU CC 的预编译头文件加快编译速度

既使用过 Microsoft® Visual C++® 又使用过 GNU CC 的网友一定会感受到两者编译速度的差异,尤其是对于 wxWidgets 这样头文件内容多的软件。Microsoft® Visual C++® 能够有很高编译效率的原因是其支持“预编译头文件” (Pre-Compiled Header, PCH)。当使用 Microsoft® Visual C++® 建立项目时,常常会建立...

weixin_28705087的博客 607

浅谈Visual C++中的预编译

转载... 所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。一、预编译头文件说明所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译

slowboy的小窝 887

如何让你加快C语言代码的编译速度

   1.每个源文件作为一个编译单元,可能会包含上百甚至上千个头文件,而在每一个编译单元,这些头文件都会被从硬盘读进来一遍,然后被解析一遍。   2.每个编译单元都会产生一个obj文件,然后所以这些obj文件会被link到一起,并且这个过程很难并行。   这里,问题在于无数头文件的重复load与解析,以及密集的磁盘操作。     下面从各个角度给出一些加快编译速度的做法,主要还是针对上面...

网络飞鸥 2363

C++中的预编译.PCH

Microsoft C 和 C++ 编译器提供了用于预编译任何 C 或 C++ 代码(包括内联代码)的选项。利用此性能特性,可以编译稳定的代码体,将已编译状态的代码存储在文件中,以及在随后的编译中,将预编译的代码与仍在开发的代码结合起来。由于不需要重新编译稳定代码,因此后面每次编译的速度都要快一些。 预编译代码有助于在开发周期中缩短编译时间,特别是在以下情况中: 总是使用不经常改动的大

xzbaimildcat的专栏 1575

QT使用预编译头技术提高编译速度

QT使用预编译头技术提高编译速度

ken2232的博客 319
上一篇: 使用Python爬取考勤信息
下一篇: 将LLVM/Clang编译器整合到Visual Studio中
witton
博客等级 码龄22年 5万+粉丝 252原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值