第2章:qmake入门:.pro文件结构、TEMPLATE变量详解、CONFIG变量详解
好,咱们今天聊聊qmake。说实话,我刚接触Qt那会儿,最头疼的就是这个.pro文件。看着一堆变量名,完全不知道它们在干嘛。后来踩了不少坑,才慢慢摸清楚门道。
qmake是Qt的构建工具,它读取.pro文件,生成Makefile。说白了,它就是帮你把C++源码、头文件、资源文件这些零散的东西,组织成一个可编译的项目。
2.1 .pro文件长什么样?
一个典型的.pro文件,其实就几行配置。我带你看看最基础的结构:
# 这是一个注释
QT += core gui widgets
TARGET = MyApp
TEMPLATE = app
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
嗯,就这么简单。每一行都是一个变量赋值。qmake会解析这些变量,然后生成对应的Makefile。
我个人习惯把.pro文件分成几个区块:
- 模块声明区:QT += ... 这里声明你用到了哪些Qt模块
- 项目配置区:TARGET、TEMPLATE、CONFIG 这些核心变量
- 源文件区:SOURCES、HEADERS、FORMS
- 资源文件区:RESOURCES、DISTFILES
你想想看,这样分区块写,后期维护起来特别清晰。我在项目中见过有人把所有文件堆在一起,那叫一个乱。
2.2 TEMPLATE变量详解
TEMPLATE变量决定了qmake生成什么类型的Makefile。说白了,就是告诉qmake:你要构建的是一个可执行程序,还是一个库,或者其他东西。
| 取值 | 含义 | 典型场景 |
|---|---|---|
| app | 构建可执行程序 | 桌面应用、命令行工具 |
| lib | 构建库文件(静态或动态) | 插件、共享库 |
| subdirs | 构建子目录项目 | 多模块项目、大型工程 |
| aux | 不构建任何东西 | 纯数据文件、文档 |
我最常用的是 TEMPLATE = app 和 TEMPLATE = subdirs。subdirs这个模板特别有意思,它允许你把一个大项目拆成多个子项目。比如:
TEMPLATE = subdirs
SUBDIRS += \
core \
ui \
plugins
每个子目录里都有自己的.pro文件。这样组织代码,结构非常清晰。我曾经在一个大型项目中,用subdirs管理了30多个子模块,编译起来井井有条。
core.depends = ui 这种写法,可以控制编译顺序。
2.3 CONFIG变量详解
CONFIG变量是qmake里最灵活的配置项。它控制编译器的行为、链接选项、调试信息等等。说白了,它就是你的编译开关集合。
常见的CONFIG取值:
| 取值 | 作用 |
|---|---|
| debug | 生成调试版本,包含符号信息 |
| release | 生成发布版本,开启优化 |
| debug_and_release | 同时生成debug和release版本 |
| static | 静态链接Qt库 |
| shared | 动态链接Qt库(默认) |
| c++17 | 启用C++17标准 |
| warn_on | 开启编译器警告 |
| warn_off | 关闭编译器警告 |
我一般这样写:
CONFIG += c++17 warn_on
CONFIG -= debug_and_release
# 根据构建模式选择
CONFIG(debug, debug|release) {
message("Building debug version")
} else {
message("Building release version")
}
这里有个坑,我必须要提醒你。CONFIG变量的赋值顺序很重要。如果你先写了 CONFIG += debug,后面又写了 CONFIG += release,那最终生效的是release。因为qmake会覆盖前面的值。
2.4 其他常用变量
除了TEMPLATE和CONFIG,还有几个变量我几乎每个项目都会用到:
- DESTDIR:指定输出目录。比如
DESTDIR = ../bin - OBJECTS_DIR:存放中间.o文件的目录。我习惯设成
OBJECTS_DIR = ../build/obj - MOC_DIR:存放moc生成的文件的目录
- RCC_DIR:存放rcc生成的资源文件的目录
- UI_DIR:存放uic生成的界面文件的目录
把这些临时文件分开存放,能让你的源码目录保持干净。我见过有人把所有编译产物都堆在源码目录里,那叫一个乱。
2.5 知识体系总览
下面这张图,是我总结的qmake.pro文件的核心知识结构。你看一眼,就能明白各个变量之间的关系:
这张图把.pro文件的核心变量和它们的关系都画出来了。你写.pro文件时,就按这个思路来:先定TEMPLATE,再配CONFIG,最后填源文件和其他路径。
contains()、count() 这些函数做更复杂的逻辑。但刚开始,掌握TEMPLATE和CONFIG就够了。
好了,这一章的内容就到这里。qmake入门其实不难,关键是理解.pro文件里每个变量的作用。你动手写几个小项目,很快就能上手。
可可精品资料库