《第一个Qt程序》中使用的编译命令还是比较简单的,而《一个稍微复杂的Qt程序》中使用的编译链接命令已经开始多起来了,还得先用 moc 工具生成元对象系统代码。这些还都是简单代码,如果项目里文件增多,自己敲命令当然复杂了,因此 Qt 开发了自己的项目构建工具——qmake。
qmake 工具有两种工作模式,它首先根据项目文件夹的头文件、源文件、图形界面文件、资源文件等,生成标准的 .pro 项目文件。然后使用第二种工作模式,qmake 可以根据 .pro 文件自动生成 Makefile 文件,我们就只需要运行一下 make 就行了,这就让 Qt 程序的项目管理和构建生成变得轻松加愉快。
我们以《一个稍微复杂的Qt程序》中的例子示范 qmake 的简单使用过程。在使用 qmake 之前,把之前生成的临时文件 moc_MyMainWindow.cpp、*.o 和 *.exe 都删了,保留手动编写的一个 .h 和两个 .cpp 文件就够了。
打开 Qt 命令行工具,进入代码所在文件夹:
用 qmake 生成项目文件:
-project选项指明使用第一种工作模式,它会扫描当前文件夹里的各种文件,然后生成对应的 .pro 文件。
"QT+=widgets"是我们针对 Qt5 自定义的一行文本,qmake 会把它添加到 .pro 文件里。qmake 默认会将 QtCore、QtGui 模块添加到项目文件里,但是从 Qt4 发展到 Qt5 后,将 QtWidgets 模块从 QtGui 里面分离出来了,新的 QtWidgets 模块不会自动添加,所以我们手动在命令里添加了 QtWidgets 模块,即在 .pro 文件里添加一句QT+=widgets。
执行上面命令之后,在 D:\QtDemo 文件夹里会出现一个自动命名的 QtDemo.pro。该 .pro 文件具体内容等会分析,我们先生成可执行程序看看。
用 qmake 生成 Makefile:
qmake 不带任何选项就是默认工作在第二种模式,它会扫描项目文件 QtDemo.pro,自动生成 Makefile 文件。
执行这条命令后,项目文件夹里会多出来这些内容:debug 和 release 两个文件夹,以及 Makefile、Makefile.Debug 和 Makefile.Release 三个文件。
Makefile 是总的生成脚本文件,Makefile.Debug 用于生成可调试的目标程序,而 Makefile.Release 用于生成优化发行版的目标程序,总的脚本 Makefile 会根据不同的 make 命令生成相应的调试版或优化发行版程序。
debug 文件夹是存储编译过程中的临时文件和可执行程序,这个是对于调试版程序。release 文件夹是也是类似的,但它是存储优化发行版的可执行程序。
调用 make 工具生成可执行程序:
MinGW 的生成工具是 mingw32-make,该命令执行之后,默认生成的是 release 版可执行程序,在 release 文件夹里。
如果想手动指定生成 debug 版本目标程序,可以执行命令:
如果手动指定生成 release 版本目标程序,可以执行命令:
如果希望同时生成 debug 和 release 两种版本程序,就执行:
执行这些命令后,可以在 debug 文件夹里看到调试版的目标程序,在 release 文件夹里看到优化发行版的目标程序,这两个文件夹里还有生成目标程序过程中的一些中间产物,如 moc_hellowidget.cpp、*.o 等。
我们在使用 qmake 构建程序的过程中,就不需要自己使用 moc 工具为 Qt 类生成元对象系统代码了,因为 qmake 自动将 moc 工具命令放在 Makefile 里面,在构建程序时会自动处理,帮程序员省了许多事。以后章节里还有 uic 、rcc 等工具也会自动在 Makefile 里调用,这是 qmake 工具的方便之处。
还在刚才的 Qt 命令行里,如果要执行调试版目标程序:
如果要执行优化发行版程序:
运行效果和之前小节的差不多,就不截图了。对于 Linux 系统,文件路径的分隔符是 / ,并且在 Linux 里的生成工具就是 make,比 mingw32-make 名字简短。
接下来我们看看 QtDemo.pro 文件里的内容:
文件里井号打头的都是注释,可以忽略掉。文件里实际起作用的就只有七句。
1) 第一句:
是我们在 qmake 命令里面指定添加的 QtWidgets 模块(即 widgets),因为隐藏包含了 QtCore(即 core)和 QtGui(即 gui),所以不用手动添加 core 和 gui。
2) 第二句:
这代表生成的目标程序类型模板,app 是可执行的应用程序,另外还可以生成静态库和动态库、插件等等。一般大部分的模板都是 app 应用程序。
3) 第三句:
TARGET 指定目标程序的名字,在 Windows 系统里就是 QtDemo.exe,在 Linux 系统里可执行程序不需要扩展名,直接就叫 QtDemo。
4) 第四句:
这句是将当前目录.添加到了包含路径(INCLUDEPATH)里,程序编译时除了从 Qt 库的包含路径,还会从当前目录里寻找头文件,比如 MyMainWindow.h 就在当前文件夹里。至于 Qt 库的包含路径,qmake 自己默认就会添加,不需要我们操心的。
5) 第五句:
当我们使用已被官方抛弃的 Qt 功能(语法、类、函数等)时,编译器会给出警告。
6) 第六句:
HEADERS 就是指定项目里的头文件。
7) 第七句:
SOURCES 就是指定项目里的源代码文件。以后还会学到图形界面文件和资源文件等,本节只需要头文件和源代码文件。
可以看出 pro 文件的语法是很简洁明了的,认识点英文,猜都能猜到大致的意思是什么。
注意文件里语句既有=,也有+=,这两个的意义和 C++ 语法类似:=是赋值,左边的变量会被指定为右边的值,并且仅仅是右边的值;+=是追加的意思,因为 qmake 会给一些变量默认添加 Qt 内置的一些值(如 Qt 库的包含路径),这些值是必需的,不能被取代,所以要用追加模式。
pro 文件可以通过 qmake 生成,或者手动编写 pro 文件也行。qmake 又可以按照 pro 文件的内容生成 Makefile,然后使用 make 构建目标程序。pro 文件是非常关键的项目管理和控制项目生成的文件,集成开发环境 QtCreator 就是采用 pro 文件管理和生成项目的,以后我们会大量接触 pro 文件。