掌握VS项目配置进阶编译器链接器配置
1。前言
在上一篇基础篇中,我们主要探讨了VS的构造系统模型,了解了VS项目最基本的输入输出配置。输入输出是系统对外的功能接口,是系统最基础的部分。
在本章的进阶篇中,我们要探讨构造系统的内部参数。内部参数用于调整构造系统的行为,这些参数主要来自构造系统中的各个工具。其中,编译器和链接器作为构造系统中最核心的工具,是和我们打交道最多的,也是本文的主要研究对象。2。配置选项
在上一篇《掌握VisualStudio项目配置【基础篇】》中,我们主要讲解了构造系统的基本输入输出配置。基本输入输出配置包含了编译器、链接器的一小部分,剩下的部分主要是编译器链接器的运行参数配置。
如下图所示,VS编译器参数配置,集中在CC配置页:
VS编译器参数配置
VS链接器相关配置,集中在链接器配置页:
VS链接器相关配置
可见VS的项目配置中,包含了大量的编译、链接配置选项。这些选项大多数情况下保持默认值即可,不需要开发者参与。
但是,某些特殊的应用需求,只有通过配置编译器、链接器选项才能实现。所有在界面上进行的配置操作,最终都会转换为编译器和链接器的运行参数。点击上图中命令行标签页即可查看这些参数。3。官方释义
下方列出了微软对于以上两个配置节点逐项解释的文档地址:CC属性页:https:learn。microsoft。comzhcncppbuildreferenceccppproppage?viewmsvc140链接器属性页:https:learn。microsoft。comzhcncppbuildreferencelinkerpropertypages?viewmsvc140
虽然微软对每一项配置都做了解释,但总体看下来,能够看懂的寥寥无几。
例如,在链接器属性页中,对以下配置项
链接器配置页配置子项
官方解释如下:
链接器配置官方讲解
不管是配置项本身还是官方释义,都很难看懂。之所以很难看懂,是因为我们对编译器链接器的工作原理和系统底层细节不够了解。所以接下来,我们要研究一下编译器和链接器。4。编译器和链接器4。1基础
由源码生成可执行程序的过程分为四个阶段:预处理,编译,汇编,链接。
由源码生成可执行程序的步骤
其中:预处理器:用于处理源码中的预处理指令;编译器:用于将源码转换成汇编代码。VS中的编译器程序为cl。exe;汇编器:将汇编代码转换为机器码,机器码保存在目标文件中(。obj),一个源文件(。cpp)对应生成一个目标文件;链接器:用于将多个包含机器码的目标文件合成为库(。dll,。lib)或可执行程序(。exe)。VS中的链接器程序为link。exe。
这些知识十分基础,不作过多描述。4。2进阶
虽然在一般项目中,集成环境已经为我们做了大部分工作,修改编译器、链接器参数的应用场景比较少,但是学习编译器链接器的深入使用,对理解底层系统、拓展技能树、拓宽技术视野、增强技术储备有很大意义。
编译器、链接器参数较多,且涉及编译原理、操作系统等底层知识,有一定的难度。很多情况下,问题本身并不难,难的是如何掌握问题背后的知识体系。所以我们要做好阅读大量资料的准备。
微软官方文档中包含了VS编译器和链接器的参考手册:MSVC编译器参考:https:learn。microsoft。comzhcncppbuildreferencecompilingaccppprogram?viewmsvc140MSVC链接器参考:https:learn。microsoft。comzhcncppbuildreferencelinking?viewmsvc140
上面两个参考文档,虽然直接作为教程有些牵强,但总体看下来,有以下几点使用价值:参考手册包括中文及英文原版内容,为一手文档,可以有效防止内容缺漏和误解。做技术要尽量看一手文档;在项目中遇到看不懂的配置选项时,可以在参考手册中查阅说明;从参考手册中,可以了解到编译器、链接器参数涉及到哪些对象、知识点,这是深入了解底层知识非常好的着手点。例如,从编译器的警告级别控制参数:w、W0、W1、W2、W3、W4、w1、w2、w3、w4、Wall、wd、we、wo、Wv、WX(警告级别):https:learn。microsoft。comzhcncppbuildreferencecompileroptionwarninglevel?viewmsvc140章节中可以进一步了解编译器有哪些警告、可以对警告进行哪些配置、pragmawarning指令的用法等等细化知识点。官方文档详尽程度有限,凡是遇到不懂的概念,都可以自行搜索相关资料,进一步了解其细节。
限于篇幅,这里仅提供了研究思路,具体配置的深入讲解将放在下一篇。5。在Qt中配置编译链接参数
我们知道,Qt可以配置不同的构建套件。在Windows上进行Qt开发时,我们通常选择VS的构建套件,即MSVC套件。VS中编译器链接器的运行参数同样可以在Qt中配置。
在Qt的。pro文件中,使用以下qmake变量可以向编译器和链接器传递参数(或叫标志flags):
C编译器:QMAKECC:用于指定C编译器名称或路径。QMAKECFLAGS:用于配置编译C源文件时的编译器参数,在所有构建模式下均生效。QMAKECFLAGSDEBUG:设置编译C源文件时的编译器参数,仅在Debug构建模式下生效。QMAKECFLAGSRELEASEWITHDEBUGINFO:设置编译C源文件时的编译器参数,仅在Profile构建模式下生效。QMAKECFLAGSRELEASE:设置编译C源文件时的编译器参数,仅在Release构建模式下生效。其他编译器配置相关qmake变量见qmake文档。
C编译器:QMAKECXX:用于指定C编译器名称或路径。QMAKECXXFLAGS:用于配置编译C源文件时的编译器参数,在所有构建模式下均生效。QMAKECXXFLAGSDEBUG:设置编译C源文件时的编译器参数,仅在Debug构建模式下生效。QMAKECXXFLAGSRELEASE:设置编译C源文件时的编译器参数,仅在Release构建模式下生效。QMAKECXXFLAGSRELEASEWITHDEBUGINFO:设置编译C源文件时的编译器参数,仅在Profile构建模式下生效。其他编译器配置相关qmake变量见qmake文档。
链接器:QMAKELFLAGS:用于配置链接器参数。QMAKELFLAGSDEBUG:用于配置链接器参数,仅在Debug构建模式下生效。QMAKELFLAGSRELEASE:用于配置链接器参数,仅在Release构建模式下生效。QMAKELFLAGSRELEASEWITHDEBUGINFO:用于配置链接器参数,仅在Profile构建模式下生效。LIBS:用于配置库搜索路径、链接程序库。其他链接器配置相关qmake变量见qmake文档。
具体的使用细节,以Qt文档为准,参考VariablesqmakeManual:https:doc。qt。ioqt5qmakevariablereference。html。
修改以上变量以后,如何验证修改的编译器链接器参数是否生效呢?在QtCreator中构建Qt项目时,要注意观察编译输出窗口。此窗口中包含构建过程中详细的步骤和参数。如下图所示:
编译输出
其中,以cl开头的命令,为编译命令,cl为编译器,后面的部分为编译器参数;以link开头的命令,为链接命令,link为链接器,后面的部分为链接器参数。
修改qmake变量后,通过对比编译器链接器参数的变化,即可验证配置的参数是否生效。注意,修改pro文件最好执行一次qmake,以确保修改生效,原理在《掌握Qt构造系统》文章中有对应解释。
下面举例说明。5。1示例1:添加编译参数
语法参考:编译器命令行语法:https:learn。microsoft。comzhcncppbuildreferencecompilercommandlinesyntax?viewmsvc140
编译器选项参考:按类别列出的编译器选项:https:learn。microsoft。comzhcncppbuildreferencecompileroptionslistedbycategory?viewmsvc140按字母顺序列出的编译器选项:https:learn。microsoft。comzhcncppbuildreferencecompileroptionslistedalphabetically?viewmsvc140
修改。pro文件:
禁用编译器优化:QMAKECXXFLAGSOd
查看编译输出:
禁用编译优化编译输出
从编译输出可以看出,Od禁用优化选项成功传递给了编译器,且编译成功。5。2示例2:添加链接参数
语法参考:链接器命令行语法:https:learn。microsoft。comzhcncppbuildreferencelinking?viewmsvc140linkercommandlinesyntax
链接器选项参考:链接器选项:https:learn。microsoft。comzhcncppbuildreferencelinkeroptions?viewmsvc140
修改。pro文件:
打开链接器详细信息输出开关:QMAKELFLAGSVERBOSE
查看编译输出:
启用链接器VERBOSE编译输出
从编译输出可以看出,Od禁用优化选项成功传递给了链接器,且编译成功,同时打印了大量链接器详细日志,这些日志对于了解链接器工作过程有帮助。
看懂编译输出是深入Qt开发的必备技能,通过编译输出能够查看到底层构建系统的运行细节,也有助于排查一些难以定位的问题。6。结语
由于编译器链接器内容繁多,限于篇幅,本文只进行了逻辑梳理,很多细节没有涉及。读者可以自行新建项目进行测试,修改配置,对比观察。编程必须要亲自动手实践,只有这样才能避免浮于表面,才能举一反三,完善知识细节。
关于特定场景下的编译器链接器配置,我们会在后面的文章中细化讲解。
本文原创发布于Qt未来工程师。
这些人小心重阳!张伯礼最新提醒不少人担心,如果新冠病毒的毒株不同,是否会再次被新冠病毒感染?据科技日报报道,近日,中国工程院院士张伯礼就二次感染的相关问题进行了解答再次感染新冠病毒的概率主要与人体免疫水平病毒株
解读一汽丰田bZ4X,19。98万起,4种续航可选,家用值得入手吗?提起TNGA架构下的一汽丰田车型,不少朋友都会和运动安全以及好开联系在一起,由此也成为了诸多消费者主要考虑的选择,其实际销量成绩同样较为优异。而如今,一汽丰田为了在国内市场进一步提
刘强东和马化腾,急了后来你发现他们都是骗子!在本年末京东两次高级别的经营理念视频学习会上,京东背后掌门人刘强东直接痛批少部分高管醉心于PPT的创作,而最终结果执行得一塌糊涂的行为。与此同时,腾讯创始人
还在担心阳了怎么办?下面的方法赶紧收藏发热一退烧药物推荐对乙酰氨基酚布洛芬连花清瘟颗粒胶囊金花清感颗粒吲哚美辛栓洛索洛芬钠片阿司匹林泡腾片安乃近片米格来宁片去痛片羚羊角口服液紫雪胶囊。二物理降温法1。温水擦浴温水擦浴适
2022年货节推荐全能本设计本哪家强?想提高生产力看这六款转眼已到年末,回顾2022一整年,各家厂商纷纷化身劳模,仅全能设计本一类就让人眼花缭乱,很多不了解笔记本市场的朋友一不小心就容易踩坑。为了方便各位想要入手全能本设计本的朋友,让自己
十年最差销量年轻人怎么就不买电视了作为一个90后,小时候最开心的时候就是放学回到家里,准时打开电视看哪吒传奇成龙历险记那些精彩的动画片。长大之后,电视离我的生活反而越来越远了。租房搬家买电视不方便,没什么好看的节目
什么时候发现自己不再年轻了什么时候发现自己不再年轻了前几天我看到一句话人都是会变老的。这句话用在我身上,简直再适合不过了。之前的很多时候,我总觉得自己还很年轻,可是慢慢地才发现,很多事情都已经变了,不再是当
阿根廷夺冠第二功臣的大心脏,是如何练就的?记者寒冰报道本届世界杯最经典的心理战,毫无疑问就是决赛的点球大战。挪威体育学院的运动心理学教授盖伊尤德,详细解读了阿根廷门将马丁内斯面对法国队的罚球手时采用的心理战术。盖伊尤德几乎
深吸一口湛江最不可错过的洗肺圣地!湛江旅游官方微信公众号关注在疫情逐步开放的今天有不少市民都成了小人除了大家都更加提高了个人防疫意识街上的空气也同时变得凝重起来仿佛大家都突然看到了病毒在空气中游荡的狰狞面目但是人是
冬天要生要养肾冬至过去了,可能都会感觉到天气越来越冷了,我国在北半球,现在这个时候是太阳离我们最远的时候,也是阳气最弱阴气最盛的时候,寒从脚下生,要穿上厚厚的羽绒服,厚厚的袜子,冬天也是老年人最
刘诗诗的10张美图,每张皆是珍藏版1。无法抗拒一起温柔的事物包括你建议周六晚上发,周日你有空嘛?2。山高自有可行路水深自有渡船人,就算全世界都背叛你我也会是你最后一件行李。3。午饭时间好好享受4。一起吹过晚风的人,