C++ QT之QTCreate创建Qt Subdirs工程全解析
从0开始构建多模块项目
接下来简单介绍介绍QT结构化工程结构,也许初学者对subdirs未曾初识,我们就来一起探讨探讨吧!
一、什么是 Subdirs 工程?
在 Qt 中,TEMPLATE = subdirs 表示这是一个项目容器(Project Container),它本身不生成可执行文件或库,而是用于管理多个子项目(Sub-Projects),例如:
- 主程序(App)
- 静态库(StaticLib)
- 动态库(SharedLib / Plugin)
- 测试项目(Test)
- 工具项目(Tool)
换句话说:Subdirs 是「工程的工程」,它能让 Qt Creator 自动管理多个子工程的构建顺序与依赖关系。
二、Qt Creator 创建 Subdirs 工程步骤
打开 Qt Creator
→ 选择 新建项目 → Other Project → Subdirs Project(子目录项目)命名工程(例如:SolutionProject)
Qt Creator 自动生成一个 .pro 文件,内容大概是:
1 | TEMPLATE = subdirs |
这就是我们的「Solution」文件(类似于 VS 的 solution.sln)。
三、添加子项目
假设我们要创建这样一个结构:
1 | SolutionProject/ |
四、顶层 SolutionProject.pro 内容详解
1 | # 顶层工程(Solution) |
| 配置项 | 说明 |
|---|---|
TEMPLATE = subdirs |
声明这是一个”多工程管理”项目 |
SUBDIRS += ... |
列出所有要包含的子工程路径 |
CONFIG += ordered |
按声明顺序编译 |
App.depends = CoreLib |
让主程序在 CoreLib 编译后构建,避免链接错误 |
五、子工程的结构和配置
1. CoreLib.pro(静态库)
1 | TEMPLATE = lib |
2. App.pro(主程序)
1 | TEMPLATE = app |
OUT_PWD:Qt 自动变量,表示构建输出目录。
3. PluginA.pro(动态库 / 插件)
1 | TEMPLATE = lib |
插件将被输出到
build_plugins/目录。
六、构建顺序与自动依赖解析
当你在 Qt Creator 中点击「运行」或「构建」主工程:
Qt 先解析顶层 .pro
发现包含子工程:CoreLib、App、PluginA、PluginB
根据 .depends 指令,确定编译顺序:
1
CoreLib → PluginA → PluginB → App
Qt 会自动进入每个子目录执行 qmake → make
编译完成后,主程序自动链接到前面构建的库
因此,当你修改了子工程(如 CoreLib)代码并重新运行主程序时,Qt Creator 会自动先重新构建 CoreLib,再构建 App —— 不需要手动切换工程。
七、手动控制输出目录(推荐)
为避免不同子项目的 .obj、.moc 混在一起,可以添加:
1 | DESTDIR = $$PWD/../bin/$$TARGET |
优点:
- 所有生成文件集中管理
- 清晰区分不同模块的构建产物
- 跨平台一致(不污染源码目录)
八、如何运行 Subdirs 工程?
在 Qt Creator 左上角的「项目树」中:
- 如果你点击 SolutionProject(顶层),Qt Creator 不会直接运行它(因为它没有可执行文件)
- 你需要右键点击子项目(如 App) → 设为启动项目(Set as Startup Project)
- 然后点击 运行,即可自动构建依赖、链接并运行主程序
Qt Creator 会智能分析依赖关系,确保 App 运行前,其依赖的库已最新构建。
九、平台特定子项目(可选)
如果某些库只在特定平台编译,可以写条件:
1 | win32: SUBDIRS += plugins/PluginWindows |
十、更复杂的场景
Qt 支持通过配置变量扩展:
1 | core.file = CoreLib/CoreLib.pro |
这种写法功能相同,只是更灵活。
十一、Subdirs 工程的优势总结
| 优势 | 说明 |
|---|---|
| ✅ 模块化管理 | 每个模块独立维护、编译、测试 |
| ✅ 自动依赖编译 | 修改库后主工程自动重建 |
| ✅ 支持静态库、动态库、插件混合 | |
| ✅ 跨平台一致 | 同一结构可在 Windows / Linux / macOS 通用 |
| ✅ 清晰的项目结构 | 适合中大型 Qt 项目(如主程序 + 插件架构) |
十二、实际使用建议
| 场景 | 建议 |
|---|---|
| 仅一个小应用 | 不需要 subdirs |
| 有多个库或插件 | ✅ 强烈建议使用 subdirs |
| 团队开发 | 使用统一的 SolutionProject.pro 管理所有模块 |
| 插件开发 | 可以使用 DESTDIR 输出到统一的 plugins/ 目录 |
TEMPLATE = subdirs 是 Qt 项目管理的”上帝视角”:它不会生成文件,但能调度整个工程结构、依赖、构建、清理,是 Qt 中大型工程的标准项目组织方式。
一旦理解这套机制,你的 Qt 项目将更易扩展、更可维护、更专业。
十三、我的示例工程
结构示例
就拿CoreLib来举例,他的插件属性是staticlib库,我想在开发的时候不需要生成静态库,而是直接编译源码,这样更方便调试,那我们就需要.pro和.pri 文件,.pri是自定义的,用于源码加载。
静态库配置(.pro)
1 | QT -= gui |
源码引入配置(.pri)
1 | # 源码级别的引入 |
在App主程序中应用模块
1 | #引入CoreLib staticlib |
OK,清楚了吗?这里不再举例了。我的工程也使用share、plugin其他插件类型的用法,这里不再说明了。上面就是我的subdirs 项目的介绍,有兴趣可以多关注,一起探讨。
我的工程开源地址:https://gitee.com/codeceo_net/qt_solution
- 本文作者: 迪丽惹Bug
- 本文链接: https://lyroom.github.io/2025/11/13/C-QT之QTCreate创建Qt-Subdirs-工程全解析,从0开始构建多模块项目/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!