1. 前言
对于日常在Qt或者Visual Studio等集成开发环境(即IDE)中编码的开发者来说,构造系统通常是比较容易被忽略的部分。集成开发环境配置简单,界面友好,可以提高开发效率。
随着对开发环境的深度使用,我们或多或少都会接触到在集成开发环境底层默默无闻工作的系统:软件构造系统。在开发环境配置正确时,开发环境可以运行得很好,就算是编程新手也可以根据生成向导来生成程序;但当开发环境配置错误时,就会出现各种问题,解决这些问题,就需要对底层的软件构造系统有所了解。限于篇幅,本文主要讲解Qt构造系统相关的内容。
2. 构造系统
2.1 构造系统介绍
学习一门技术,从需求上去分析此技术产生的原因,弄清楚其解决了什么问题,可以加深对技术的理解。
当一个项目很小的时候,直接使用编译器、链接器等编译工具,就可以把代码构建成程序。
当项目越来越大时,除了需要调用编译工具编译程序,还需要做很多事情:选择编译工具、设置编译选项、添加头文件、添加第三方库、添加资源文件、运行构建流程、自动部署、自动化测试等等。每个步骤可能都需要调用一个工具来完成,这导致构造软件的任务变得非常繁琐,如果每次都需要开发者手动来完成,那么将产生大量的重复劳动。为了解放开发者的双手,提高生产力,我们可以将重复劳动交由计算机来完成。于是构造系统出现了。
使用构造系统,我们可以将需要配置的参数、需要执行的任务编写成可执行的代码。在需要执行构建任务的时候,执行此代码即可。为了修改方便及使用的灵活性,这些代码通常是以脚本的形式存在的,脚本是不需要被编译就可以执行的、文本格式的代码,它由一个专门的解释器解释执行。这些脚本可以被称作构建脚本,也可以叫做生成文件。
解释器的名字通常就是构造系统的名字。例如,C++开发中常见的构造系统有:
-
GNU Make -
CMake -
qmake
2.2 构造系统和集成开发环境的关系
看到这里也许大家会联想到集成开发环境。它们二者之间:
相同点是,它们都封装了软件构建的底层细节。
不同点是,集成开发环境是在构造系统的基础上添加了图形界面,以GUI界面的方式配置构造系统,其底层仍然是构造系统在工作。由于构建脚本的学习和编写需要不少学习成本,使用GUI的方式可以大大简化软件开发时的上手难度。
最后,如果想要系统地了解软件构造系统,可以阅读相关书籍,这里推荐书籍《深入理解软件构造系统:原理与最佳实践》。
3. Qt构造系统
3.1 Qt构造系统介绍
Qt构造系统即qmake。
qmake定义了一套Qt自己的语法体系,相对于CMake亦或是Make,语法相对更为简单,容易上手。
同时为了响应Qt跨平台的能力,QMake也具备跨平台生成能力。
关于qmake用法,可以参考Qt帮助文档,里面有非常详细的讲解。
3.2 图解
Qt构造系统图解如下:
如上图所示,qmake是建立在Make构建系统之上的。可见它没有完全重新定义一种新的构建系统。
类似于CMake,它通过将qmake的构建脚本转换为Makefile构建脚本,我们在Qt Creator中点击构建按钮的时候,Qt Creator会调用Make系统,执行生成的Makefile构建脚本,从而完成项目构建。
特别地,Qt Creator允许我们自定义构建步骤,如下图所示:
可以看到,构建时,Qt Creator会先执行qmake生成Makefile,再运行 jom.exe 执行Makefile。
需要提及的是,qmake除了可以生成Makefile,还可以生成Visual Studio工程,从而可以在Visual Studio中进行Qt开发。
4. 应用与理解
4.1 在Qt Creator中执行qmake的作用
在Qt开发中,我们会经常遇到添加或者删除文件后,或者修改.pro文件后,修改没有生效的情况。
很多情况下,这是因为对.pro文件的修改没有更新到Makefile中。根据上面的“Qt构造系统图解”图可知,你只需要在Qt Creator中执行一次qmake(如下图所示),即可完成从.pro文件到Makefile的更新,从而使修改生效。
4.2 查看MakeFile文件
了解Qt构建系统其原理后,下面我们验证一下
以项目untitled1为例,其构建输出文件夹为 build-untitled1-Desktop_Qt_5_7_0_MSVC2013_32bit-Debug,打开此文件夹,即可看到Makefile文件,如下图所示:
5. 结语
本文主要采用了图解的方式,描绘了Qt构造系统的模型结构,解释了构造系统中各个模块的关系与运作方式。希望能让你对隐藏于Qt Creator界面之下的底层构建原理有更深入的理解,从而解决开发中的软件构建相关的实际问题。
6. 参考资料:
-
通过命令行使用 Microsoft C++ 工具集 | Microsoft Learn
本文原创发布于公众号“Qt未来工程师”。
发表评论