掌握Qt构造系统

news2025/1/31 8:26:17

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构造系统图解如下:

Qt构造系统图解

如上图所示,qmake是建立在Make构建系统之上的。可见它没有完全重新定义一种新的构建系统。

类似于CMake,它通过将qmake的构建脚本转换为Makefile构建脚本,我们在Qt Creator中点击构建按钮的时候,Qt Creator会调用Make系统,执行生成的Makefile构建脚本,从而完成项目构建。

特别地,Qt Creator允许我们自定义构建步骤,如下图所示:

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的更新,从而使修改生效。

Qt Creator中执行qmake

4.2 查看MakeFile文件

了解Qt构建系统其原理后,下面我们验证一下

以项目untitled1为例,其构建输出文件夹为 build-untitled1-Desktop_Qt_5_7_0_MSVC2013_32bit-Debug,打开此文件夹,即可看到Makefile文件,如下图所示:

qmake生成的Makefile文件

5. 结语

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

6. 参考资料:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.0、Hibernate-级联关系

2.0、Hibernate-级联关系 级联关系 中 最为常见的就是 -> 1、一对多关系 :一个消费者可以购买多个商品 -> 生成多个订单; 消费者是1,订单是多 那么在数据库中,1 的一方是主表,多的一方是从表,通过主外键关系去维…

C# Winform 三层架构

一、介绍 三层架构是 C# 桌面开发中比较常用的框架,是由 表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构组成,目的是为了 “高内聚,低耦合”。开发人员分工更明…

深度学习入门(六十五)循环神经网络——序列到序列学习(seq2seq)

深度学习入门(六十五)循环神经网络——序列到序列学习(seq2seq)前言循环神经网络——序列到序列学习(seq2seq)课件机器翻译seq2seq编码器-解码器细节训练衡量生成序列的好坏的BLEU总结教材1 编码器2 解码器…

为什么世界500强企业都要求员工必须学Python编程语言?

行业的更迭与进化并非虚无缥缈,它就发生在我们每天的生活中。当代最具竞争力的技能是什么?高盛、JP 摩根、麦肯锡等顶级公司纷纷给出了答案——编程。 今年新加入摩根大通的全部资产管理分析师必须强制学习编程语言,Python。 摩根大通资产管…

【Java异常】处理异常

一:异常的处理:抓抛处理 过程一:"抛":程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象并将此对象抛出一旦抛出对象以后,其后的代码不再执行 过程二:&…

科班演员陶弈菱:北京电影学院的系统学习是我艺术道路上最大的底气

今天的记忆是带着海水的味道………”12月18日,在年末岁尾之际,徽风皖韵熏陶下成长的新生代演员陶奕菱再次来到海南三亚,受邀参加第四届海南岛国际电影节,迫不及待地跑向沙滩面朝大海,感受多姿多彩的魅力三亚。 优雅端…

在 React 中应用设计模式:策略模式

这篇文章是关于我们许多人在 React 和前端开发中遇到的一个问题(有时甚至没有意识到这是一个问题):在不同的组件、钩子、实用程序等中实现了一段逻辑。 让我们深入了解问题的详细信息以及如何解决它。正如标题所暗示的,我们将使用…

DPDK-收包完整过程

本篇博客作为自己了解dpdk收包过程的一个记录。在写时发现已经有很多写DPDK收包过程的博客了,但还是决定自己写一遍。 DPDK收包分为两个阶段,首先是DMA将数据包从网卡搬运到内存,然后是调用dpdk提供的接口rte_eth_rx_burst去取。但是具体是怎…

Oracle和其他数据库有什么区别?从引号开始了解!

无论测试或者开发,对数据库的增删改查都是家常便饭。但有些小知识是经常被忽略,却又不能不去了解的,例如单引号和双引号的用法和区别,看完这一篇,你肯定会有收获。 首先我们要区别一个概念,即单引号(‘)和…

【Java语言】— Java基础02

1.数据类型 (1)数据类型的作用 数据类型就是约束变量存储数据的形式。 数据类型 变量名称初始值;(2)数据类型的分类 引用数据类型(除基本数据类型之外的,如String)基本数据类型:4大类8种。 …

如何从 0 开始学 Python 自动化测试开发(一)

本文是「如何从 0 开始学 Python 自动化测试开发」专题系列文章第一篇,适合零基础入门的同学。 作者方程老师,是前某跨国通信公司高级测试经理,目前为某互联网名企资深测试技术专家,也是霍格沃兹测试学院特邀讲师。有十余年大型电…

项目管理软件怎么选?只需要关注4点

项目管理有许多不同的风格,但无论如何管理项目,根据企业的当前需求和未来发展轨迹选择合适的项目管理软件都很重要。 虽然大多数优秀的项目管理软件都提供相似的功能,但没有两个平台是完全相同的。以下是企业在选择项目管理软件时应该考虑的…

【虹科新闻】虹科与SOSLAB正式建立合作伙伴关系

近日,虹科与SOSLAB正式建立合作伙伴关系,虹科将共同与SOSLAB开展亚太地区市场开发,聚焦于工业领域客户开拓,深入本地技术支持、测试与售后服务落地,为客户提供高效、可靠的激光雷达解决方案。 “虹科很高兴与SOSLAB合作…

锁等待超时

问题背景 今天测试同事发现项目里面大部分接口报错,把日志捞出来看了下出现大量的锁等待超时的错误。 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transactionat sun.reflect.N…

MULLS: Versatile LiDAR SLAM via Multi-metric Linear Least Square论文阅读

1. 摘要 随着自动驾驶与移动建图的快速发展,实际项目中对现成的激光SLAM建图方案的需求也越来越强烈,并且要求解决方案适用于各种不同规格的激光雷达与各种复杂场景。因此,我们提出了MULLS,一种高效,低漂移&#xff0…

状态观测控制器设计与仿真验证

【无限嚣张(菜菜)】:hello您好,我是菜菜,很高兴您能来访我的博客,我是一名爱好编程学习研究的菜菜,每天分享自己的学习,想法,博客来源与自己的学习项目以及编程中遇到问题…

深度学习炼丹-数据处理和增强

前言一,Normalization 概述 1.1,Normalization 定义1.2,什么情况需要 Normalization1.3,Data Normalization 方法1.4,示例代码 二,normalize images 2.1,图像 normalization 定义2.2&#xff0c…

[XCTF]halo(2019护网杯)(难度2)

目录 前言 一、题目重述 二、解题思路 1.Base64解密 2.难以想到的异或运算 三、flag 总结 前言 注意!攻防世界题目有误!!给出题目与原题不一样但是答案却和护网杯原题答案一样!! 一、题目重述 aWdxNDs0NDFSOz…

NVM Express Base Specification 2.0c - 2 Theory of Operation

The interface has the following key attributes: 在命令提交或完成路径中不需要非缓存/ MMIO寄存器读取;在命令提交路径中最多需要一个MMIO寄存器写或一个64B消息;支持多达65,535个I/O队列,每个I/O队列支持多达65,535个未完成的命令;优先级与每个I/O队列相关联&a…

【MySQL】基于InnoDB的数据库索引

文章目录前言1、索引引入2、索引语法2.1、创建索引2.2、查看索引2.3、删除索引2.4、案例引入3、索引结构3.1、概述3.2、引擎支持3.3、BTree3.4、Hash4、索引类别4.1、分类4.2、过程分析5、性能分析5.1、执行频率5.2、慢查询日志5.3、explain6、最左前缀原则7、索引失效7.1、范围…