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

相关推荐
RAN11426760082 小时前
1.3第一个程序的介绍
开发语言·qt
实心儿儿9 小时前
Qt — 命名方式、坐标系
qt
小小龙学IT11 小时前
Qt QPainter 2D 绘图系统深度解析:从画笔到渲染引擎适
c++·qt
深兰科技12 小时前
深兰科技受邀参与第二届中国(南宁)—东盟人工智能场景应用对接会,深化AI国际合作
人工智能·qt·r语言·scala·symfony·智能机器人·深兰科技
实心儿儿12 小时前
Qt — 对象树
qt
Quz1 天前
QML Repeater 数据模型:ListModel 与 C++ QAbstractListModel
qt
Quz1 天前
QML Repeater 基础用法:整数、JS 数组、字符串数组三种模型
qt
江湖人称菠萝包1 天前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter3-Qt类库概述
笔记·qt·qt5
qq_344920561 天前
Qt事件过滤器
开发语言·c++·qt
sunriver20001 天前
【Qt】由于找不到 Qt6Core5Compatd.dll
qt·qt6core5compatd