适用于大型 Qt/C++ 项目 ,可以把一个很大的 .pro 文件拆分成多个子文件,方便维护。
一、为什么要拆分 .pro
当 .pro 文件很大时(例如几百个 .cpp 文件),会出现:
.pro文件过长,不好维护- Git diff 很混乱
- 不同模块代码混在一起
- 新人很难理解工程结构
Qt 提供了 .pri 子项目文件 来解决这个问题。
.pri 文件可以被 .pro 文件 include。
二、基本原理
Qt 支持:
pro
include(file.pri)
.pri 文件可以包含:
SOURCESHEADERSINCLUDEPATHLIBSDEFINESCONFIG
所以 .pri 可以看成 .pro 的子模块。
三、示例工程结构
假设有一个项目:
Project
│
├── project.pro
├── pri
│ ├── module_algorithm.pri
│ ├── module_controller.pri
│ ├── module_driver.pri
│ ├── module_thread.pri
│
└── src
├── algorithm
├── controller
├── driver
└── thread
四、主 .pro 文件
主工程只保留 全局配置 和 include 子模块。
pro
QT += core network
CONFIG += c++17
# 全局宏
DEFINES += PROJECT_ENABLE_LOG
# 引入子模块
include(pri/module_algorithm.pri)
include(pri/module_controller.pri)
include(pri/module_driver.pri)
include(pri/module_thread.pri)
主 .pro 文件通常只有 几十行。
五、模块 .pri 文件
例如:
module_algorithm.pri
pro
SOURCES += \
src/algorithm/algorithm1.cpp \
src/algorithm/algorithm2.cpp
HEADERS += \
src/algorithm/algorithm1.h \
src/algorithm/algorithm2.h
INCLUDEPATH += \
src/algorithm
module_controller.pri
pro
SOURCES += \
src/controller/controller1.cpp \
src/controller/controller2.cpp
HEADERS += \
src/controller/controller1.h \
src/controller/controller2.h
INCLUDEPATH += \
src/controller
module_driver.pri
pro
SOURCES += \
src/driver/driver1.cpp \
src/driver/driver2.cpp
HEADERS += \
src/driver/driver1.h \
src/driver/driver2.h
INCLUDEPATH += \
src/driver
六、编译方式
拆分后:
-
编译方式不变
-
仍然执行:
qmake
make
Qt 会自动把 .pri 内容合并到 .pro。
七、模块划分建议
大型 Qt 项目通常按模块拆分:
| 模块 | 内容 |
|---|---|
| algorithm | 算法 |
| controller | 控制逻辑 |
| driver | 硬件驱动 |
| protocol | 通信协议 |
| thread | 线程 |
| system | 系统管理 |
例如:
pri
├── algorithm.pri
├── controller.pri
├── driver.pri
├── protocol.pri
└── thread.pri
八、常见高级用法
条件编译
pro
unix {
LIBS += -lpthread
}
win32 {
LIBS += -lws2_32
}
架构判断
pro
contains(QT_ARCH, x86_64) {
message("x86 platform")
}
contains(QT_ARCH, arm64) {
message("ARM64 platform")
}
定义宏
pro
DEFINES += ENABLE_DEBUG
代码中:
cpp
#ifdef ENABLE_DEBUG
qDebug()<<"debug mode";
#endif
九、.pro 与 .pri 区别
| 文件 | 作用 |
|---|---|
.pro |
Qt 工程入口 |
.pri |
子模块配置 |
.pri 不能单独编译 ,必须被 .pro include。
十、适合使用 .pri 的项目规模
推荐在以下情况使用:
| 文件数量 | 建议 |
|---|---|
| < 50 | 单 .pro |
| 50 ~ 200 | 拆 .pri |
| > 200 | 多 .pri |
| > 1000 | SUBDIRS 多工程 |
十一、更大的工程结构(工业项目)
大型 Qt 项目一般结构:
Project
│
├── project.pro
├── pri
│ ├── algorithm.pri
│ ├── controller.pri
│ ├── driver.pri
│ ├── protocol.pri
│ ├── media.pri
│ └── thread.pri
│
├── src
│ ├── algorithm
│ ├── controller
│ ├── driver
│ ├── protocol
│ ├── media
│ └── thread
十二、优点
拆分 .pro 后:
- 工程结构更清晰
- 不同模块独立维护
- Git 冲突减少
- 新人更容易理解