赞
踩
原标题:掌握VS项目配置 【进阶】— 编译器链接器配置
在上一篇基础篇中,我们主要探讨了VS的构造系统模型,了解了VS项目最基本的输入输出配置。输入输出是系统对外的功能接口,是系统最基础的部分。
在本章的进阶篇中,我们要探讨构造系统的内部参数。内部参数用于调整构造系统的行为,这些参数主要来自构造系统中的各个工具。其中,编译器和链接器作为构造系统中最核心的工具,是和我们打交道最多的,也是本文的主要研究对象。
在上一篇《掌握Visual Studio项目配置【基础篇】》中,我们主要讲解了构造系统的基本输入输出配置。基本输入输出配置包含了编译器、链接器的一小部分,剩下的部分主要是编译器链接器的运行参数配置。
如下图所示,VS编译器参数配置,集中在"C/C++"配置页:
VS链接器相关配置,集中在“链接器”配置页:
可见VS的项目配置中,包含了大量的编译、链接配置选项。这些选项大多数情况下保持默认值即可,不需要开发者参与。
但是,某些特殊的应用需求,只有通过配置编译器、链接器选项才能实现。所有在界面上进行的配置操作,最终都会转换为编译器和链接器的运行参数。点击上图中“命令行”标签页即可查看这些参数。
下方列出了微软对于以上两个配置节点逐项解释的文档地址:
虽然微软对每一项配置都做了解释,但总体看下来,能够看懂的寥寥无几。
例如,在**“链接器”**属性页中,对以下配置项
官方解释如下:
不管是配置项本身还是官方释义,都很难看懂。之所以很难看懂,是因为我们对编译器链接器的工作原理和系统底层细节不够了解。所以接下来,我们要研究一下编译器和链接器。
由源码生成可执行程序的过程分为四个阶段:预处理,编译,汇编,链接。
其中:
这些知识十分基础,不作过多描述。
虽然在一般项目中,集成环境已经为我们做了大部分工作,修改编译器、链接器参数的应用场景比较少,但是学习编译器链接器的深入使用,对理解底层系统、拓展技能树、拓宽技术视野、增强技术储备有很大意义。
编译器、链接器参数较多,且涉及编译原理、操作系统等底层知识,有一定的难度。很多情况下,问题本身并不难,难的是如何掌握问题背后的知识体系。所以我们要做好阅读大量资料的准备。
微软官方文档中包含了VS编译器和链接器的参考手册:
MSVC编译器参考:https://learn.microsoft.com/zh-cn/cpp/build/reference/compiling-a-c-cpp-program?view=msvc-140
MSVC链接器参考:https://learn.microsoft.com/zh-cn/cpp/build/reference/linking?view=msvc-140
上面两个参考文档,虽然直接作为教程有些牵强,但总体看下来,有以下几点使用价值:
限于篇幅,这里仅提供了研究思路,具体配置的深入讲解将放在下一篇。
我们知道,Qt可以配置不同的构建套件。在Windows上进行Qt开发时,我们通常选择VS的构建套件,即MSVC套件。VS中编译器链接器的运行参数同样可以在Qt中配置。
在Qt的.pro文件中,使用以下qmake变量可以向编译器和链接器传递参数(或叫标志flags):
C编译器:
C++编译器:
链接器:
具体的使用细节,以Qt文档为准,参考 Variables | qmake Manual:https://doc.qt.io/qt-5/qmake-variable-reference.html。
修改以上变量以后,如何验证修改的编译器链接器参数是否生效呢?在Qt Creator中构建Qt项目时,要注意观察 编译输出窗口。此窗口中包含构建过程中详细的步骤和参数。如下图所示:
其中,
修改qmake变量后,通过对比编译器链接器参数的变化,即可验证配置的参数是否生效。注意,修改pro文件最好执行一次qmake,以确保修改生效,原理在《掌握Qt构造系统》文章中有对应解释。
下面举例说明。
语法参考:
编译器选项参考:
修改.pro文件:
禁用编译器优化:
QMAKE_CXXFLAGS += -Od
查看编译输出:
从编译输出可以看出,-Od禁用优化选项成功传递给了编译器,且编译成功。
语法参考:
链接器选项参考:
修改.pro文件:
打开链接器详细信息输出开关:
QMAKE_LFLAGS += /VERBOSE
查看编译输出:
从编译输出可以看出,-Od禁用优化 选项成功传递给了链接器,且编译成功,同时打印了大量链接器详细日志,这些日志对于了解链接器工作过程有帮助。
看懂编译输出是深入Qt开发的必备技能,通过编译输出能够查看到底层构建系统的运行细节,也有助于排查一些难以定位的问题。
由于编译器链接器内容繁多,限于篇幅,本文只进行了逻辑梳理,很多细节没有涉及。读者可以自行新建项目进行测试,修改配置,对比观察。编程必须要亲自动手实践,只有这样才能避免浮于表面,才能举一反三,完善知识细节。
关于特定场景下的编译器链接器配置,我们会在后面的文章中细化讲解。
本文原创发布于 Qt未来工程师。原文地址:https://mp.weixin.qq.com/s/DZ9dsgPay0JwaVGaz74W4w
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。