C++的编译链接与在vs中build提速

这篇具有很好参考价值的文章主要介绍了C++的编译链接与在vs中build提速。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通过gcc或msvc,clang等编译器编译出来的C++源文件是.o文件。在windows上也就是PE文件,linux为ELF文件,在这一步中,调用其它代码文件中的函数的函数地址是未知的(00000),等到链接之后才会替换掉函数地址的

linux,windows 可执行文件(ELF、PE)

C++是如何编译的

C/C++编译过程主要分为4个过程

  1. 编译预处理
  2. 编译、优化阶段
  3. 汇编过程
  4. 链接程序

C++的编译链接与在vs中build提速

编译游戏引擎的耗时

内网使用IB(incrediBuild)编译引擎时总耗时2分23秒,编译2分钟,link耗时15秒

在vs中提高c++的编译速度

达到修改一行代码,10s内编译完,link会花点时间,因为所的工程都是lib,而不是dll,如果改成dll,则会更快。

调试信息的格式

把所有的工程的属性这项: C/C++ - General - Debug Information Format ,改成:C7 compatible (/Z7)

实际上是在vcxproj文件中增加了这样一项:<DebugInformationFormat>OldStyle</DebugInformationFormat>

Debug Information Format是一个编译器选项,用于控制生成的调试信息的格式。

调试信息是一种用于调试程序的数据,包括变量名、函数名、行号等信息。在程序出现错误时,调试信息可以帮助开发人员快速定位问题。

Debug Information Format选项有以下几种可选值:

  1. None:不生成调试信息。

  2. Program Database (/Zi):生成一个独立的PDB文件,包含所有的调试信息。

  3. Program Database for Edit and Continue (/ZI):生成一个独立的PDB文件,包含所有的调试信息,并且支持编辑和继续调试。

  4. Old Style (/Z7):将调试信息嵌入到可执行文件中。

需要注意的是,生成调试信息会增加可执行文件的大小,因此在发布版本时应该关闭调试信息生成。

另外,需要注意的是,如果使用了/DEBUG选项,那么编译器会自动将Debug Information Format选项设置为Program Database (/Zi)。

预编译头

选中工程,右键 - 属性 - C/C++ - Precompiled Headers - Precompiled Header 改成 Not

就是把一些固定的东西先编译好,其他cpp文件直接引用就不copy了,这东西在分布式下没用, 单机是有效果的

什么是预编译头?

includeN多的头文件会导致编译变慢,提取整个项目公共头文件放到一起,只编译一次,减少编译时间。

增量编译

在入口工程启用增量编译 : Linker - General - Enable Incremental Linking,勾选:Yes (/INCREMENTAL)

Linker - Optimization

右键 - 属性,Linker - Optimization - 把这2项改成No

  • References :No (/OPT:NOREF)
  • Enable COMDAT Folding :No (/OPT:NOICE)

OptimizeReferences 用于控制是否优化未使用的函数和数据的代码生成,当OptimizeReferences选项设置为/OPT:REF时,编译器将在链接时删除未使用的函数和数据,以减小可执行文件的大小。这可以减少可执行文件的大小,提高程序的运行效率。

EnableCOMDATFolding 用于控制是否启用COMDAT折叠优化,当Enable COMDAT Folding选项设置为Yes/OPT:ICF时,编译器将启用COMDAT折叠优化。这可以减少可执行文件的大小,提高程序的运行效率。

Linker - Debugging

右键 - 属性, Linker - Debugging , Generate Debug Info 改成Faster,可以link的更快

cgthreads(Code generation threads)

cl 默认使用的线程数是 4 ,最大可设置成 8 ,如果拥有更多核心时设置为8将可以缩短构建时间,在开启GL时效果更佳

在项目 配置属性 > C/C++ > 命令行 增加 /cgthreads8

MP(Build with multiple processes)

当您编译许多文件时,编译器选项可以显着减少构建时间。为了缩短构建时间,编译器会创建最多processMax自身的副本,然后同时使用这些副本来编译源文件

其他模式建议开启, published 模式 , 测试后构建时间并无明显差异, 因为MP对链接时编译并不能起到提速作用

同样也是在项目 配置属性 > C/C++ > 命令行 增加 /mp

Incredibuild(集群编译)

使用ib编译完之后,再从vs按F5即可启动调试,已经生成了pdb文件。

非published模式(非WPO模式) 建议以下设置:

打开IB,切到Visual Studio Builds - Advanced

  1. 关闭 Limit Concurrent PDB file Instances to []
  2. 开启 Force 64-bit tooset

使用集群或者限制本机cpu的核数,这俩动态控制好,但是本机使用一半的核还是会卡,因为其它进程不一定会分配到空闲的CPU

打开IB,切到Initiator - General

  1. Avoid task execution on local machine when possible(尽可能避免在本地计算机上执行任务)

  2. CPU Allocation : Limit maximum number of cores utilized in build to (限制构建过程中可使用的最大核心数为)

WPO

全程序优化(Whole program optimization) 功能,是为了增加文件之间的可见性,将编译延迟到了链接时

WPO 可以提高程序的执行性能,一般在发布模式下都会开启此功能,代价只是增加了部分构建时长

如果开启WPO模式后, 不建议使用 IB 构建, 也许可能会有未知问题

makefile

摘自UE引擎的某个makefile示例

CXXFLAGS += -std=c++11 -Wall -Wextra -pedantic -Wcast-align -Wcast-qual -Wno-ctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wmissing-declarations -Wmissing-include-dirs -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-overflow=5 -Wswitch -Wundef -Wno-unused -Wnon-virtual-dtor -Wreorder -Wdeprecated -Wno-float-equal
CPPFLAGS += -I ../single_include -I . -I thirdparty/doctest -I thirdparty/fifo_map -DDOCTEST_CONFIG_SUPER_FAST_ASSERTS

SOURCES = src/unit.cpp \
          src/unit-algorithms.cpp \
OBJECTS = $(SOURCES:.cpp=.o)

TESTCASES = $(patsubst src/unit-%.cpp,test-%,$(wildcard src/unit-*.cpp))          

CMake

cmake.txt示例

cmake_minimum_required(VERSION 3.17)
project(mycpp)

set(CMAKE_CXX_STANDARD 11)
#添加需要编译的文件
add_executable(strTest strTest.cpp)

C/C++为什么要写头文件?

来源: 为什么C/C++要分为头文件和源文件? - 知乎 (zhihu.com)

C时代的时候编译器比较简单,是固定的编译和链接两个过程,编译一次只处理一个文件,进行预处理之后,头文件会插入到这一个文件里,不同源代码文件的处理时独立的,这样如果头文件里面定义了一个函数的实现,编译的时候所有引用这个头文件的源码文件,生成的obj里都会有这个符号。而链接是通用的链接程序,从汇编时代就用的工具,没有什么高级功能,同一个符号链接时出现两次是会报错的。

但是,我们又说了,每个文件的编译是独立的,所以如果实现不在当前源文件里面,调用的时候编译器就不知道这个函数的类型和签名,没法生成调用代码,所以必须在调用之前先声明一遍。如果不把声明写在头文件里面,就必须在每个用到这个函数的源文件里都声明一遍,很不方便,所以综合之后的解决方案就是实现写源码文件里面,声明写头文件里面。文章来源地址https://www.toymoban.com/news/detail-693300.html

到了这里,关于C++的编译链接与在vs中build提速的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux的编译器——gcc/g++(预处理、编译、汇编、链接)

    前言: 本文主要认识与学习 Linux 环境下常用的编译器—— gcc (编译 C 代码)/ g++ (编译 C++ 代码)的常用指令等、程序实现的两大环境、动态库与静态库的理解等。 任何一个 C 程序的实现都要经过 翻译环境 与 执行环境 。 在翻译环境中又分为4个部分, 预编译、编译、汇

    2024年02月13日
    浏览(43)
  • 编译器、链接器和解释器

    编译器的作用就是将高级编程语言翻译为机器代码。 编译器工作过程一般分为: 词法分析:将高级语言解析成 Token 集合; 语法分析:将 Token 集合构建成语法树,在这个过程可以判断出语法是否有误,比如 while 后面是否 { 等等; 语义分析:判断语法树是否有明显的语义错处

    2024年02月14日
    浏览(38)
  • VS Code 使用 clang++ 编译,使用 cppvsdbg 或 lldb 调试的配置方法

    VS Code LLVM C/C++(用来配置 c_cpp_properties.json) CodeLLDB(如果你要用 lldb 调试,那么这个插件就需要安装,用来连接到 lldb 调试器) 我们都知道配置编译器要设置三个 json,task, launch, c_cpp_properties.json task.json 直接通过 terminal - configure default build task - C/C++: clang++.exe build active file

    2024年02月09日
    浏览(46)
  • 如何在Qt中配置MSVC编译器链接器参数?

    原标题:掌握VS项目配置 【进阶】— 编译器链接器配置 在上一篇基础篇中,我们主要探讨了VS的构造系统模型,了解了VS项目最基本的输入输出配置。输入输出是系统对外的功能接口,是系统最基础的部分。 在本章的进阶篇中,我们要探讨构造系统的内部参数。内部参数用于

    2024年02月15日
    浏览(50)
  • qt qtcreator qt+vs 编译器

    对于一个新手而言,基本体会如下: Qt Creator Qt Creator优势 可以实现Ui和代码无缝切换。(VS不行) 对于汉字的支持更好 提示功能做的更好。 比如:#include等,敲出#inc即有提示。 qmake非常好用 项目管理更方便,可以添加pri之类的来管理子模块 Qt Creator劣势(IDE本身巨大劣势)

    2024年02月08日
    浏览(55)
  • 链接文件学习(七):英飞凌MCU Tasking编译器LSL链接文件解析 及代码变量定位方法

    目录   1、Tasking的链接文件 1.1、DSRAM中的数据存放 1.2、PFlash中的代码存放 1.3、LMU 1.4、PSRAM 1.5、UCB 2、代码与变量定位

    2024年02月07日
    浏览(52)
  • 【OpenCV】VS编译器配置OpenCV库路径

            大家好呀,本篇是我在学习OpenCV库的时候一开始需要在vs2019或者vs2022编译器底下进行配置的一篇学习笔记,希望能够对OpenCV感到困惑的同学有所帮助。         废话不多说,我们直接开始吧: 目录 下载OpenCV  配置Microsoft.Cpp.x64.user文件 1.找到Microsoft.Cpp.x64.user文件

    2024年02月04日
    浏览(53)
  • 在makefile中,CC(编译器)和LD(链接器)代表什么?

    这些变量的名称源自相应工具的名称。通常这些缩写的含义如下: CC 代表“ C c ompiler”(在GCC缩写中,它也被视为“ c ompiler c ollection”)。 LD 是一个链接器(来自“ l ink e d itor”或“ l oa d er”)。 CPP 代表 “ C p re p rocessor” CXX 是一个 C++ 编译器

    2024年02月15日
    浏览(47)
  • Matlab配置编译器(Matlab2020b+vs2013)

    Matlab可以使用 mex –setup 命令来设置编译器 如果是先装visual studio后装matlab,一般情况下只需要在命令行输入mex –setup按照提示选择即可完成编译器的设置 如果是先装matlab后装visual studio,很可能无法找到编译器,那就需要修改设置 1、matlab安装目录 MATLAB2020binwin64mexopts 中有

    2024年02月05日
    浏览(52)
  • 【Linux】Linux编译器 gcc/g++的使用&&初识动静态链接库

    ​ ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:Linux 🎯 长路漫漫浩浩,万事皆有期待 上一篇博客:【Linux】Linux环境基础工具的基本使用及配置(yum、vim) 在上一篇 Linux 博客中,我们讲解了 vim 编辑器的使用,可以在 Linux 上写

    2024年02月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包