1 概述

qmake 工具有助于简化跨平台的开发项目的构建过程。它用于自动生成 Makefile,借助 qmake 我们创建每个 Makefile 时可能只需要简单地编写几行信息即可。

qmake 工具为我们提供了一个面向项目的构建系统,用于管理应用程序、库和其他组件的构建过程。利用 qmake 使我们能够控制所使用的源文件,并可以在单个文件中简要地描述流程中的每个步骤。qmake 将每个 project 文件中的信息解析并生成对应的 Makefile 文件,之后就可以使用这个 Makefile 文件执行编译和链接。

但是,蛋疼的一幕出现了,Qt公司准备放弃qmake了,转战CMake。 尽管CMake异常的强大,使用广泛,对我们这些常年中意于QMake的程序员,就痛苦了。希望QMake能够被Qt公司支持的更久一些吧!

2 描述项目

项目由 project (以 .pro 为后缀) 文件的内容描述,以pri文件为共同引用项。pro和CMake中的CMakeLists.txt相似,pri和CMake中的xx.cmake文件类似。

3 语法指令

3.1 SOURCES 源文件

假设有hello.cpp, hello.h, main.cpp源文件

SOURCES += \
  hello.cpp \
  main.cpp

3.2 HEADERS 头文件

假设有hello.cpp, hello.h, main.cpp源文件

HEADERS += hello.h \

3.3 TARGET 目标名称

设置可执行程序的名称

TARGET = helloworld

3.4 RESOURCES 资源文件

RESOURCES += \
  tcpclientcontrol.qrc

3.5 FORMS ui文件

FORMS += \
    mainwindow.ui \

3.6 INCLUDEPATH 引用头文件目录

INCLUDEPATH +=  \
    $$PWD/common    \
# $$PWD是当前pro文件所在目录

3.7 LIBS 引用lib文件

LIBS += \
  -L"$$PWD/depends/QCefView/Release/lib" -lQCefView \
# -L和-l都是固定字符,"$$PWD/depends/QCefView/Release/lib"是路径,QCefView是库名称,不带后缀名

3.8 DESTDIR 可执行程序所在目录

DESTDIR = bin

3.9 RC_ICONS 应用程序图标

RC_ICONS += icons/logo.ico

3.10 DEFINES 定义宏

# 定义宏语法,下面定义了一个CustomMarco宏
DEFINES += CustomMarco
#定义整形变量,宏定义赋值的等号“=”两边不能有空格,即写成DEFINES += LENGTH = 3会编译报错
DEFINES += LENGTH=3
#定义字符串变量,字符串必须使用 \\\" 引起来
DEFINES += APP_VERSION=\\\"2.1\\\"

3.11 debug和release判断

CONFIG(debug, debug|release) {
# debug环境
} else {
# release环境
}

3.12 系统架构判断

#函数原型为contains(variablename, value),如果 variablename 包含 value 则返回成功
#QMAKE_HOST.arch:qmake变量,计算机架构
#x86_64:终端输入 lscpu 可以参看当前计算机架构,x86 是 x86_64,arm64 是 aarch64,
#或者直接 message($$QMAKE_HOST.arch) 输出到概要信息
contains(QMAKE_HOST.arch, x86_64) {
    message("编译平台: x86")
} else {
    message("编译平台: arm64")
}
# 或者下面的方式也行
contains(QT_ARCH, arm64) {
  message("arm64")
} else {
  message("x86")
}

3.13 操作系统判断

# win系统
win32 {

}

# linux系统
unix{

}

# mac系统
macx {

}

3.14 win下编译器判断

# msvc编译器
win32-msvc*{
    message("msvc")
}
# gcc编译器
win32-g++{
    message("g++")
}

3.15 32位和64位判断

contains(QT_ARCH, i386) {
  # 32位
  message("32-bit")
} else {
  # 64位
  message("64-bit")
}