参考文档: ​​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的安装目录中找到:

Qt -- qmake(1)_教程

把它们复制到其它的目录中

Qt -- qmake(1)_qmake_02

在上述目录中新建一个文本文件取名为hello.pro并打开它进行编辑

通过​​SOURCE​​变量添加源文件:

SOURCES += hello.cpp
SOURCES += main.cpp
# 或者
SOURCES = hello.cpp \
main.cpp

通过​​HEADERS​​变量添加头文件:

HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp

目标名默认与.pro文件同名,在这个例子中则为hello,至于后缀名windows下为hello.exe. 另外也可以通过 TARGET 设置:

TARGET = helloworld

最终的文件:

HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp

执行qmake:

qmake -o Makefile hello.pro

注:需要在qt的命令行环境中才可执行操作:

Qt -- qmake(1)_qt 配置_03

双击运行!然后切换到相应的目录执行上述命令:

Qt -- qmake(1)_qmake_04


可以被debug的程序

CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp

添加平台特有的源文件

CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
win32 {
SOURCES += hellowin.cpp
}
unix {
SOURCES += hellounix.cpp
}

再次执行qmake,在Makefile.Debug中

Qt -- qmake(1)_教程_05

也没有找到hellounix.cpp...

文件不存在时停止并退出qmake

CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
win32 {
SOURCES += hellowin.cpp
}
unix {
SOURCES += hellounix.cpp
}
!exists( main.cpp ) {
error( "No main.cpp file found" )
}

多个条件检查

CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
win32 {
SOURCES += hellowin.cpp
}
unix {
SOURCES += hellounix.cpp
}
!exists( main.cpp ) {
error( "No main.cpp file found" )
}
# wind32 且 debug ...
win32:debug {
CONFIG += console
}

编译报错

尝试着运行makefile但是发现报错了,或许还需要更多的学习才可以解决这个问题吧....

Qt -- qmake(1)_qt 配置_06

创建项目文件

.pro文件中包含所有qmake编译应用程序,库或者插件所需要的信息。使用一系列声明来指定项目中使用的资源,同时也支持一些简单的程序结构使您可以根据不同的平台和环境描述不同的编译过程。

"一些简单的程序结构"指的是类似下面的代码(类似于条件语句):

win32 {
SOURCES += hellowin.cpp
}
unix {
SOURCES += hellounix.cpp
}
!exists( main.cpp ) {
error( "No main.cpp file found" )
}
win32:debug {
CONFIG += console
}

.pro文件中的元素

qmaek通过.pro文件可以构建简单和复杂的编译系统

  • 简单的项目文件通过声明语句,定义标准的变量(如SOURCES, HEADERS)来指定包含的源文件和头文件
  • 复杂的项目文件可有会用到控制流结构来微调编译过程

变量

在.pro文件中,变量通常保存字符串列表。在最简单的项目中,这些变量告诉qmake要使用的配置选项,或者提供在构建过程中使用的文件名和路径。

qmake在每个项目文件中查找某些变量,并使用这些变量的内容来确定应该向Makefile写入什么。

例如​​HEADERS​​​和​​SOURCES​​变量中的值列表用于告诉qmake与项目文件位于同一目录中的头文件和源文件。

还可以在内部使用变量来存储临时的值列表,并且可以用新值覆盖或扩展现有的值列表。

以下代码段说明了如何给变量列表赋值(跟Makefile的语法一样):

HEADERS = mainwindow.h paintwidget.h

SOURCES = main.cpp mainwindow.cpp \
paintwidget.cpp

CONFIG += console

# 删除值
CONFIG -= colsole

​CONFIG​​是qmake中另一个特殊变量。

以下表格给出了一些常用的变量和它所对应的内容,所有的变量描述请看链接:​​https://doc.qt.io/qt-6/qmake-variable-reference.html​

变量

内容

​CONFIG​

通常项目的配置选项

​DESTDIR​

目标文件存放的目录

​FORMS​

UI文件列表,会被​​uic​​程序处理

​HEADERS​

头文件列表

​QT​

在项目中用到的Qt模块

​RESOURCES​

资源文件(.qrc),​​更多.qrc文件信息...​

​SOURCES​

源代码文件.cpp或者.c之类的

​TEMPLATE​

项目所使用的模板,这决定了输出文件是.exe?库?还是插件...

在变量名前加$$来引用它的内容

TEMP_SOURCES = $$SOURCES

空白

在赋值语句中,两个值用空白隔开,如果值中包含空白,需要用双引号括起来

DEST = "Program Files"

如果说路径中包含变量,也需要用“”括起来

INCLUDEPATH += "C:/mylibs/extra headers"

注释

# Comments usually start at the beginning of a line, but they
# can also follow other content on the same line.

内置函数和控制流

使用内置函数

include(other.pro)

控制流(相当于if语句)

win32 {
SOURCES += paintwidget_win.cpp
}

当条件为真时才会执行大括号内的语句,在这个用例中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

make all # 编译 release 和 debug版本

CONFIG += build_all, makefile 默认编译所有版本。

测试是否开启了指定的配置选项

CONFIG(opengl) {
message(Building with OpenGL support.)
} else {
message(OpenGL support is not available.)
}

通过这种方式,我们可以让debug和release版本使用不同的配置,​​请查看(使用范围)...​

选项

描述

qt

该项目是一个qt程序,应该链接到qt库。QT变量可以控制哪些附加模块被项目使用,默认是被添加的,CONFIG -= qt 可以移除这个选项

x11

c++11, 如果是QT程序此值不需要被指定

声明Qt库

使用network和xml库

QT += network xml

QT默认包含

QT = gui core # 默认的
# 要以移除
QT -= gui

更多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​

声明其它库

指定库和头文件路径

LIBS += -L/usr/local/lib -lmath
INCLUDEPATH = c:/msdev/include d:/stl/include

解决编译报错的问题

在开始使用qmake(教程)最后一小节,尝试用 mingw32-make 编译项目但它报错了,其它是少了一个QT库,加上后如下:

TEMPLATE = app
CONFIG += qt
CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
QT += widgets
win32 {
SOURCES += hellowin.cpp
}
unix {
SOURCES += hellounix.cpp
}

加上后再编译就没有错了...

Qt -- qmake(1)_qmake_07

运行效果:

Qt -- qmake(1)_qmake_08

或许是内容太多,电脑配置太差,写到这打字都感觉有点卡顿了...就到这吧,没完成的内容将在系列2或系列3中继续