参考文档: https://doc.qt.io/qt-6/qmake-manual.html
什么是qmake?
- qmake是一个简化编译过程的构建工具,具有跨平台的特性
- 根据项目文件(.pro)生成makefile文件
- 可以用qmake编译任何软件项目(不用qt写的也可以)
- 也可以生成visual studio的工程文件
概述
qmake可以管理应用程序,库和其它组件的编译过程,qmake将每个项目文件拓展为一个Makefile文件用于执行编译和链接命令。
描述项目
使用.pro文件描述项目,qmake用这个文件生成makefile.项目文件通常包含:
- 源文件和头文件列表
- 项目的配置信息
- 任何特定应用程序的细节,如第二方库的链接列表,或者需要额外包含的头文件
.pro文件可以包含多种不同的元素内容比如:
- 注释
- 变量声明
- 内置函数
- 一些简单的控制结构
编译项目
对于简单的项目,只需要在项目的顶层目录运行qmake,生成makefile文件,然后再运行相应平台的make工具编译编译项目。
关于qmake在编译过程中使用的环境变量,请参考:https://doc.qt.io/qt-6/qmake-environment-reference.html
使用第三方库
请参考第三方库使用指南:https://doc.qt.io/qt-6/configure-options.html#third-party-libraries
预编译头文件
在大型项目中,可能通过预编译头文件加快编译过程,更多信息请查看:https://doc.qt.io/qt-6/qmake-precompiledheaders.html
开始使用qmake(教程)
本教程教你qmake的基础知识...
从简单的例子开始
假设你的项目中有以下文件:
- hello.cpp
- hello.h
- main.cpp
这些文件可以在qt的安装目录中找到:
把它们复制到其它的目录中
在上述目录中新建一个文本文件取名为hello.pro并打开它进行编辑
通过SOURCE变量添加源文件:
通过HEADERS变量添加头文件:
目标名默认与.pro文件同名,在这个例子中则为hello,至于后缀名windows下为hello.exe. 另外也可以通过 TARGET 设置:
最终的文件:
执行qmake:
注:需要在qt的命令行环境中才可执行操作:
双击运行!然后切换到相应的目录执行上述命令:
可以被debug的程序
添加平台特有的源文件
再次执行qmake,在Makefile.Debug中
也没有找到hellounix.cpp...
文件不存在时停止并退出qmake
多个条件检查
编译报错
尝试着运行makefile但是发现报错了,或许还需要更多的学习才可以解决这个问题吧....
创建项目文件
.pro文件中包含所有qmake编译应用程序,库或者插件所需要的信息。使用一系列声明来指定项目中使用的资源,同时也支持一些简单的程序结构使您可以根据不同的平台和环境描述不同的编译过程。
"一些简单的程序结构"指的是类似下面的代码(类似于条件语句):
.pro文件中的元素
qmaek通过.pro文件可以构建简单和复杂的编译系统
- 简单的项目文件通过声明语句,定义标准的变量(如SOURCES, HEADERS)来指定包含的源文件和头文件
- 复杂的项目文件可有会用到控制流结构来微调编译过程
变量
在.pro文件中,变量通常保存字符串列表。在最简单的项目中,这些变量告诉qmake要使用的配置选项,或者提供在构建过程中使用的文件名和路径。
qmake在每个项目文件中查找某些变量,并使用这些变量的内容来确定应该向Makefile写入什么。
例如HEADERS和SOURCES变量中的值列表用于告诉qmake与项目文件位于同一目录中的头文件和源文件。
还可以在内部使用变量来存储临时的值列表,并且可以用新值覆盖或扩展现有的值列表。
以下代码段说明了如何给变量列表赋值(跟Makefile的语法一样):
CONFIG是qmake中另一个特殊变量。
以下表格给出了一些常用的变量和它所对应的内容,所有的变量描述请看链接:https://doc.qt.io/qt-6/qmake-variable-reference.html
变量 | 内容 |
CONFIG | 通常项目的配置选项 |
目标文件存放的目录 | |
FORMS | UI文件列表,会被uic程序处理 |
头文件列表 | |
QT | 在项目中用到的Qt模块 |
资源文件(.qrc),更多.qrc文件信息... | |
源代码文件.cpp或者.c之类的 | |
项目所使用的模板,这决定了输出文件是.exe?库?还是插件... |
在变量名前加$$来引用它的内容
空白
在赋值语句中,两个值用空白隔开,如果值中包含空白,需要用双引号括起来
如果说路径中包含变量,也需要用“”括起来
注释
内置函数和控制流
使用内置函数
控制流(相当于if语句)
当条件为真时才会执行大括号内的语句,在这个用例中win32 在 CONFIG选项中必须被设置,在window平台上,这个设置会自动发生。
工程模板
TEMPLATE变量指项目会编译成什么类型
Template | 输出 |
app(default) | 可执行文件(windows上是.exe) |
lib | 编译成库,windows上.lib, .dll |
aux | 什么也不做,如果你的项目是用如python这样的解释型语言,用它最合适。 |
subdirs | 每个子目录必须包含自己的项目文件 |
vcapp | Visual Studio Project app |
vclib | Visual Studio Project file to build a library. |
vcsubdirs | Visual Studio Solution file to build projects in sub-directories. |
基本配置
CONFIG变量指定项目应该配置的选项和特性。
debug or release?
- CONFIG +=debug debug
- CONFIG +=release release
- CONFIG +=
debug_and_release
rease and debug
CONFIG += build_all, makefile 默认编译所有版本。
测试是否开启了指定的配置选项
通过这种方式,我们可以让debug和release版本使用不同的配置,请查看(使用范围)...
选项 | 描述 |
qt | 该项目是一个qt程序,应该链接到qt库。QT变量可以控制哪些附加模块被项目使用,默认是被添加的,CONFIG -= qt 可以移除这个选项 |
x11 | c++11, 如果是QT程序此值不需要被指定 |
声明Qt库
使用network和xml库
QT默认包含
更多qt变量:https://doc.qt.io/qt-6/qmake-variable-reference.html#qt
特性配置
qmake可以在.prf文件中指定额外配置,更多信息请查看:https://doc.qt.io/qt-6/qmake-advanced-usage.html#adding-new-configuration-features
声明其它库
指定库和头文件路径
解决编译报错的问题
在开始使用qmake(教程)最后一小节,尝试用 mingw32-make 编译项目但它报错了,其它是少了一个QT库,加上后如下:
加上后再编译就没有错了...
运行效果:
或许是内容太多,电脑配置太差,写到这打字都感觉有点卡顿了...就到这吧,没完成的内容将在系列2或系列3中继续