使用qmake工具提升效率
qmake 工具有两种工作模式,它首先根据项目文件夹的头文件、源文件、图形界面文件、资源文件等,生成标准的 .pro 项目文件。然后使用第二种工作模式,qmake 可以根据 .pro 文件自动生成 Makefile 文件,我们就只需要运行一下 make 就行了,这就让 Qt 程序的项目管理和构建生成变得轻松加愉快。
我们以《一个稍微复杂的Qt程序》中的例子示范 qmake 的简单使用过程。在使用 qmake 之前,把之前生成的临时文件 moc_MyMainWindow.cpp、*.o 和 *.exe 都删了,保留手动编写的一个 .h 和两个 .cpp 文件就够了。
1) 进入文件夹
打开 Qt 命令行工具,进入代码所在文件夹:cd /d D:\QtDemo
2) 生成项目文件
用 qmake 生成项目文件:qmake -project "QT+=widgets"
-project
选项指明使用第一种工作模式,它会扫描当前文件夹里的各种文件,然后生成对应的 .pro 文件。"QT+=widgets"
是我们针对 Qt5 自定义的一行文本,qmake 会把它添加到 .pro 文件里。qmake 默认会将 QtCore、QtGui 模块添加到项目文件里,但是从 Qt4 发展到 Qt5 后,将 QtWidgets 模块从 QtGui 里面分离出来了,新的 QtWidgets 模块不会自动添加,所以我们手动在命令里添加了 QtWidgets 模块,即在 .pro 文件里添加一句QT+=widgets
。执行上面命令之后,在 D:\QtDemo 文件夹里会出现一个自动命名的 QtDemo.pro。该 .pro 文件具体内容等会分析,我们先生成可执行程序看看。
3) 生成 Makefile 文件
用 qmake 生成 Makefile:qmake
qmake 不带任何选项就是默认工作在第二种模式,它会扫描项目文件 QtDemo.pro,自动生成 Makefile 文件。执行这条命令后,项目文件夹里会多出来这些内容:debug 和 release 两个文件夹,以及 Makefile、Makefile.Debug 和 Makefile.Release 三个文件。
Makefile 是总的生成脚本文件,Makefile.Debug 用于生成可调试的目标程序,而 Makefile.Release 用于生成优化发行版的目标程序,总的脚本 Makefile 会根据不同的 make 命令生成相应的调试版或优化发行版程序。
debug 文件夹是存储编译过程中的临时文件和可执行程序,这个是对于调试版程序。release 文件夹是也是类似的,但它是存储优化发行版的可执行程序。
4) 生成可执行程序
调用 make 工具生成可执行程序:mingw32-make
MinGW 的生成工具是 mingw32-make,该命令执行之后,默认生成的是 release 版可执行程序,在 release 文件夹里。如果想手动指定生成 debug 版本目标程序,可以执行命令:
mingw32-make debug
如果手动指定生成 release 版本目标程序,可以执行命令:mingw32-make release
如果希望同时生成 debug 和 release 两种版本程序,就执行:mingw32-make all
执行这些命令后,可以在 debug 文件夹里看到调试版的目标程序,在 release 文件夹里看到优化发行版的目标程序,这两个文件夹里还有生成目标程序过程中的一些中间产物,如 moc_hellowidget.cpp、*.o 等。我们在使用 qmake 构建程序的过程中,就不需要自己使用 moc 工具为 Qt 类生成元对象系统代码了,因为 qmake 自动将 moc 工具命令放在 Makefile 里面,在构建程序时会自动处理,帮程序员省了许多事。以后章节里还有 uic 、rcc 等工具也会自动在 Makefile 里调用,这是 qmake 工具的方便之处。
5) 运行可执行程序
还在刚才的 Qt 命令行里,如果要执行调试版目标程序:debug\QtDemo.exe
如果要执行优化发行版程序:release\QtDemo.exe
运行效果和之前小节的差不多,就不截图了。对于 Linux 系统,文件路径的分隔符是 / ,并且在 Linux 里的生成工具就是 make,比 mingw32-make 名字简短。分析 QtDemo.pro 文件
接下来我们看看 QtDemo.pro 文件里的内容:
######################################################################
# Automatically generated by qmake (3.1) Tue Jun 4 15:59:41 2019
######################################################################
QT+=widgets
TEMPLATE = app
TARGET = QtDemo
INCLUDEPATH += .
# The following define makes your compiler warn you if you use any
# feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
# Input
HEADERS += MyMainWindow.h
SOURCES += main.cpp MyMainWindow.cpp
1) 第一句:
QT+=widgets
是我们在 qmake 命令里面指定添加的 QtWidgets 模块(即 widgets),因为隐藏包含了 QtCore(即 core)和 QtGui(即 gui),所以不用手动添加 core 和 gui。2) 第二句:
TEMPLATE = app
这代表生成的目标程序类型模板,app 是可执行的应用程序,另外还可以生成静态库和动态库、插件等等。一般大部分的模板都是 app 应用程序。3) 第三句:
TARGET = QtDemo
TARGET 指定目标程序的名字,在 Windows 系统里就是 QtDemo.exe,在 Linux 系统里可执行程序不需要扩展名,直接就叫 QtDemo。4) 第四句:
INCLUDEPATH += .
这句是将当前目录.
添加到了包含路径(INCLUDEPATH)里,程序编译时除了从 Qt 库的包含路径,还会从当前目录里寻找头文件,比如 MyMainWindow.h 就在当前文件夹里。至于 Qt 库的包含路径,qmake 自己默认就会添加,不需要我们操心的。5) 第五句:
DEFINES += QT_DEPRECATED_WARNINGS
当我们使用已被官方抛弃的 Qt 功能(语法、类、函数等)时,编译器会给出警告。6) 第六句:
HEADERS += MyMainWindow.h
HEADERS 就是指定项目里的头文件。7) 第七句:
SOURCES += main.cpp MyMainWindow.cpp
SOURCES 就是指定项目里的源代码文件。以后还会学到图形界面文件和资源文件等,本节只需要头文件和源代码文件。可以看出 pro 文件的语法是很简洁明了的,认识点英文,猜都能猜到大致的意思是什么。
注意文件里语句既有
=
,也有+=
,这两个的意义和 C++ 语法类似:=
是赋值,左边的变量会被指定为右边的值,并且仅仅是右边的值;+=
是追加的意思,因为 qmake 会给一些变量默认添加 Qt 内置的一些值(如 Qt 库的包含路径),这些值是必需的,不能被取代,所以要用追加模式。pro 文件可以通过 qmake 生成,或者手动编写 pro 文件也行。qmake 又可以按照 pro 文件的内容生成 Makefile,然后使用 make 构建目标程序。pro 文件是非常关键的项目管理和控制项目生成的文件,集成开发环境 QtCreator 就是采用 pro 文件管理和生成项目的,以后我们会大量接触 pro 文件。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算