untitled是什么软件()

图图资源公众号引导关注.jpg
以上资料,免费领取,领取地址:https://vip.f6sj.com

1. 前言

对于日常在Qt或者Visual Studio等集成开发环境(即IDE)中编码的开发者来说,构造系统通常是比较容易被忽略的部分。集成开发环境配置简单,界面友好,具有良好的开发效率。

随着对开发环境的深度使用,我们或多或少都会接触到在集成开发环境底层默默工作的系统:软件构造系统。在开发环境配置良好时,开发环境可以运行得很好,仅需掌握构建、调试等几个按钮的使用方法就可以开发程序。但是,当开发环境配置出现错误时,就会出现很多棘手问题。想要解决这些问题,就需要对开发环境底层的软件构造系统有所了解。

Qt拥有自己的一套构造系统,了解其原理架构,是深入了解Qt原理,熟练掌握Qt开发的必修课。本文主要讲解Qt构造系统相关的内容。

2. 构造系统

2.1 构造系统介绍

学习一门技术,从需求上去分析此技术产生的原因,弄清楚其解决了什么问题,可以加深对技术的理解。

当一个项目很小的时候,直接使用编译器、链接器等编译工具,就可以把代码构建成程序。

当项目越来越大时,除了需要调用编译工具编译程序,还需要做很多事情,例如:

  • 配置编译工具
  • 设置编译选项
  • 添加头文件
  • 添加第三方库
  • 添加资源文件
  • 自动增量编译,自动检测文件修改
  • 链接程序
  • 软件自动部署
  • 自动化测试等等

完成这些步骤,需要调用几个甚至几十个工具来完成。这导致构造软件的任务变得非常繁琐,如果每次构建都需要开发者手动逐个调用工具完成,就会产生大量的、机械的重复性劳动。为了解放开发者的双手,提高生产力,我们可以将重复、机械的劳动交给计算机来完成。在这种需求的驱动下,构造系统出现了。

在构造系统中,我们可以将需要配置的参数、需要执行的任务、构造流程,编写成可执行的代码。在需要执行构造任务的时候,执行编写好的构造代码即可。使用构造系统,一方面可以最大限度地减少重复劳动,一方面因为构造代码一旦编写完成,执行起来非常简单,所以可以降低构造程序的技术门槛。

为了修改方便及使用的灵活性,这些代码通常是以脚本的形式存在的,脚本是不需要被编译就可以执行的、文本格式的代码,它由一个专门的解释器解释执行。这些脚本可以被称作构建脚本,也可以叫做生成文件。

解释器的名字通常就是构造系统的名字。例如,C++开发中常见的构造系统有:

  • GNU Make(Linux
  • CMake(开源)
  • nmake(微软
  • qmake(Qt)

当然其他语言也有自己的构造系统,构造系统之所以这么多,是因为每种语言有自己独特的构造流程与规则。由于它们是同一类工具,总体逻辑相似,解决了类似的问题,所以总体来看,不同的构造系统还是大同小异的。

2.2 构造系统和集成开发环境的关系

看到这里也许大家会联想到集成开发环境。它们二者之间:

相同点是,它们都封装了软件构建的底层细节。

不同点是,集成开发环境是在构造系统的基础上添加了图形界面,以GUI界面的方式配置构造系统,其底层仍然是构造系统在工作。由于构建脚本的学习和编写需要不少学习成本,使用GUI的方式可以大大简化软件开发时的上手难度。

最后,如果想要系统地了解软件构造系统,可以阅读相关书籍,这里推荐书籍《深入理解软件构造系统:原理与最佳实践》。

3. Qt构造系统

3.1 Qt构造系统介绍

Qt构造系统即qmake。

qmake定义了一套Qt自己的语法体系,相对于CMake亦或是Make,语法相对更为简单,容易上手。

同时为了响应Qt跨平台的能力,qmake也具备跨平台生成能力。

关于qmake用法,可以参考Qt帮助文档,里面有非常详细的讲解。

3.2 图解

Qt构造系统图解如下:

untitled是什么软件()

Qt构造系统图解

如上图所示,qmake是建立在某种Make(如gun make,nmake)构造系统之上的。

也就是说,qmake通过将qmake的构建脚本(即Qt的.pro文件),转换为Make构建脚本(即MakeFile),实现了从qmake构造系统向Make构造系统的转换,这就是qmake的工作原理。

3.3 从Qt Creator构建设置中看构造系统

我们在Qt Creator中点击构建按钮的时候,Qt Creator会调用qmake生成Makefile,然后调用本地的Make系统,执行生成的Makefile构建脚本,从而完成项目构建。从Qt Creator中,可以找到qmake系统的相关的配置,如下图所示:

untitled是什么软件()

Qt Creator构建步骤设置

可以看到,构建时,Qt Creator会先执行qmake生成Makefile,再运行 jom.exe 执行Makefile,和理论一致。反过来,对于上图中的Build步骤配置部分的内容及作用,我们也能很容易理解了。在理解的基础上,我们可以对构建步骤做出适当修改,以及添加自定义构建步骤,如添加程序安装步骤,使.pro文件中的INSTALLS命令生效等。这也是深入学习Qt的必备技能。也许刚开始接触Qt开发时,会对这些配置不知所措,但是一旦理解了其原理及架构,这些配置看起来就显得比较简单了。

3.4 从编译输出中看构造系统

Qt Creator的编译输出窗口,可以更加清楚地看到Qt构建程序时的实时过程,或者叫构建日志。 以构造untitled1项目为例,编译输出窗口如下图所示:

untitled是什么软件()

编译输出窗口

可以看到,开始构建后,

  • 首先Qt会检查项目各项配置是否改变,来决定是否需要执行qmake;
  • 之后Qt启动了 jom.exe 来执行Makefile构造脚本对源码进行编译、链接。
  • 如果没有其他构造任务则退出

在编译输出窗口中,可以看到编译工具、编译参数等非常详细的构造信息。

如果在构造过程中,产生了编译错误,Qt构造系统会将错误信息输出到编译输出窗口,并在“1 问题”标签页中汇总所有构造错误,便于查看。

对于专业的Qt开发者来说,看懂编译输出,是必备技能。对于习惯了GUI操作的开发者来说,阅读密密麻麻的字符确实不是一件令人愉悦的事情。但是在了解Qt构造系统以后,我们可以将编译输出与构造步骤对应起来,同时将每个构造步骤下面的一些子步骤也对应起来,看似杂乱无章的编译输出内容,通过层层分解,立刻变得结构清晰,大大降低了阅读难度。

注:

  • qmake除了可以生成Makefile,还可以生成Visual Studio工程,从而实现在Visual Studio中进行Qt开发。
  • CMake和qmake原理基本相同,功能也很类似,感兴趣的同学可以查找相关资料,对比学习。在后面的文章中会对CMake进行讲解。

4. 应用与理解

4.1 在Qt Creator中执行qmake的作用

在Qt开发中,我们会经常遇到添加或者删除项目文件,或者修改.pro文件后,修改没有生效的情况。由此引发的最常见的编译错误是:

No rule to make target …

产生这个错误的原因之一是对.pro文件的修改没有更新到Makefile中。根据上面的“Qt构造系统图解”图可知,在这种情况下,你只需要在Qt Creator中执行一次qmake(如下图所示),即可完成从.pro文件到Makefile的更新,从而使修改生效。

untitled是什么软件()

Qt Creator中执行qmake

4.2 查看MakeFile文件

了解Qt构建系统原理及架构后,我们可以直接查看构建目录,了解更多细节。

以项目untitled1为例,其构建目录为 build-untitled1-Desktop_Qt_5_7_0_MSVC2013_32bit-Debug,打开此文件夹,可看到由qmake生成的Makefile文件。如下图所示:

untitled是什么软件()

qmake生成的Makefile文件

打开Makefile文件后,可以看到其内容为相当长的构造脚本,它的语法相对于qmake的语法更为复杂。换句话说,qmake简化了Makefile的语法,但同时也完全能够满足我们的开发需求。语法上的细节并不会影响我们对Qt构造系统原理及架构的理解。更多qmake及Makefile语法相关内容,会在后面的构造脚本编写的专题中深入讲解,限于篇幅,这里不再赘述。

5. 结语

本文主要采用了图解的方式,描绘了Qt构造系统的原理及模型结构,解释了构造系统中各个模块的关系与运作方式。希望能让你对隐藏于Qt Creator界面之下的底层构建原理有更深入的理解,从而解决开发中的软件构建相关的实际问题。

6. 参考资料:

  • 通过命令行使用 Microsoft C++ 工具集 | Microsoft Learn
  • NMAKE 参考 | Microsoft Learn

本文原创发布于公众号“Qt未来工程师”。

网站右侧边栏广告位.jpg
本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630371849@qq.com 举报,一经查实,本站将立刻删除。
如若转载,请注明出处:https://www.mcw3.com/17961.html