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

相关推荐
云小逸20 小时前
【 VS2013 集成 Qt5.7.1 踩坑记录:moc/uic/rcc 报“系统找不到指定的路径”怎么解决?】
开发语言·windows·qt
努力努力再努力wz21 小时前
【Qt入门系列】深入理解信号与槽:从事件响应到自定义信号机制
c语言·开发语言·数据结构·数据库·c++·qt·mysql
mengzhi啊21 小时前
串口数据监控软件开发总结
qt
小短腿的代码世界21 小时前
Qwt实时FFT频谱分析深度解析:从信号采集到可视化渲染的完整架构设计
前端·qt·架构·交互
Hua-Jay21 小时前
OpenCV联合C++/Qt 学习笔记(二十)----Harri角点检测、Shi-Tomas角点检测及亚像素级别角点位置优化
c++·笔记·qt·opencv·学习·计算机视觉
十五年专注C++开发21 小时前
QFluentKit: 一个基于 Qt Widgets 的 Fluent Design 风格 UI 组件库
开发语言·c++·qt·ui·qfluentkit
Hua-Jay21 小时前
OpenCV联合C++/Qt 学习笔记(十九)----图像分割
c++·笔记·qt·opencv·学习
小短腿的代码世界1 天前
Qt位置服务深度解析:从GPS定位到地理围栏的完整架构设计
开发语言·qt
史迪仔01121 天前
[QML] Qt5/6图像色彩空间处理
开发语言·前端·c++·qt
小短腿的代码世界1 天前
传感器暗战:Qt Sensors如何让桌面应用“感知“物理世界?
开发语言·qt