Qt/C++ 项目 pro` 文件管理办法

适用于大型 Qt/C++ 项目 ,可以把一个很大的 .pro 文件拆分成多个子文件,方便维护。


一、为什么要拆分 .pro

.pro 文件很大时(例如几百个 .cpp 文件),会出现:

  • .pro 文件过长,不好维护
  • Git diff 很混乱
  • 不同模块代码混在一起
  • 新人很难理解工程结构

Qt 提供了 .pri 子项目文件 来解决这个问题。

.pri 文件可以被 .pro 文件 include


二、基本原理

Qt 支持:

pro 复制代码
include(file.pri)

.pri 文件可以包含:

  • SOURCES
  • HEADERS
  • INCLUDEPATH
  • LIBS
  • DEFINES
  • CONFIG

所以 .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 冲突减少
  • 新人更容易理解

相关推荐
Quz5 天前
QML Hello World 入门示例
qt
xcyxiner8 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner9 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner9 天前
DicomViewer (添加模型类)3
qt
xcyxiner10 天前
DicomViewer (目录调整) 2
qt
xcyxiner10 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能12 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G12 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt
森G12 天前
77、线程池原理和实现------服务器源码解析----云视频服务项目
服务器·c++·qt
森G12 天前
71、打包发布---------打包发布
c++·qt