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

相关推荐
小短腿的代码世界3 小时前
Qt Concurrent 深度解析:并发编程范式与源码级实现原理
qt·系统架构·lucene
Ulyanov7 小时前
《PySide6 GUI开发指南:QML核心与实践》 第一篇:GUI新纪元——QML与PySide6生态系统全景
开发语言·python·qt·qml·雷达电子对抗
Drone_xjw11 小时前
解决 Qt 程序在 Kylin(麒麟)系统下表头“白屏”的问题
开发语言·qt·kylin
米优13 小时前
qt+gstreamer实现播放功能
qt·gstreamer
zjun100113 小时前
QT:语言翻译
开发语言·qt
-凌凌漆-15 小时前
【Qt】const QString &与QString的区别
开发语言·qt
Drone_xjw15 小时前
Qt QTableView 表头变白问题(Kylin/UKUI系统)原因分析与解决方案
开发语言·qt·kylin
mabing99315 小时前
Qt 实现自定义分段控制器
开发语言·qt
誰能久伴不乏15 小时前
Qt 混合编程核心原理:C++ 与 QML 通信机制详解
linux·c++·qt·架构·状态模式
sycmancia16 小时前
Qt——文本编辑器中的数据存取
开发语言·qt