Qt 5.9.9 + MSVC2015 64bit + qmake 超详细全流程手册
目录
Qt 5.9.9 + MSVC2015 64bit + qmake 超详细全流程手册
第一部分 基础概念 & 工程文件全景(人工阶段)
1.1 整套工具链分工(底层定位)
1.2 工程目录结构(影子构建,Qt 标准规范)
目录分层
1.3 逐个文件深度详解
1.3.1 .pro 工程文件(qmake 核心配置文件)
完整可运行示例(带全注释)
关键约束
1.3.2 .h 头文件(重点:Q_OBJECT 宏规则)
强制规则(高频报错点)
1.3.3 .cpp 源文件
1.3.4 .ui 界面文件
1.3.5 .qrc Qt 资源文件
1.3.6 .rc Windows 原生资源文件(可选)
1.3.7 .pro.user 文件
第二部分 阶段 1:qmake 生成编译规则(从 .pro → Makefile)
2.1 执行时机与命令
2.2 qmake 完整工作流程(隐性动作拆解)
2.3 qmake 全部输出文件 & 作用
2.4 核心约束
第三部分 阶段 2:jom 启动编译调度(总控入口)
3.1 jom 与 nmake 区别
3.2 jom 核心能力
3.3 整体调度链路
第四部分 阶段 3:Qt 预处理工具(非 C++ 文件转 C++ 代码)
4.1 uic.exe (UI 编译器,处理 .ui)
执行命令(Makefile 自动调用)
输入输出
生成代码细节
运行逻辑
4.2 rcc.exe (资源编译器,处理 .qrc)
执行命令
输入输出
底层原理
4.3 moc.exe (元对象编译器,Qt 灵魂)
设计背景
执行命令
输入输出
moc 生成的代码明细(逐段说明)
致命约束 & 报错对应
4.4 rc.exe (MSVC 原生资源编译器,处理 .rc)
执行命令
第五部分 阶段 4:cl.exe MSVC 编译(源码 → 目标文件 .obj)
5.1 编译输入文件全集
5.2 完整编译命令 + 逐参数解析
Release 版本完整指令
高危坑点
5.3 cl.exe 输出产物
第六部分 阶段 5:link.exe MSVC 链接(.obj → 可执行文件 .exe)
6.1 链接输入文件全集
6.2 完整链接命令 + 参数解析
6.3 链接产物(Debug / Release 区分)
Debug 模式(调试版)
Release 模式(发行版)
6.4 链接阶段经典报错根源
第七部分 阶段 6:编译后依赖 & 部署(可运行闭环)
7.1 依赖 1:MSVC 运行库
7.2 依赖 2:Qt 动态库 & 插件
第八部分 阶段 7:文件清理(中间文件运维)
第九部分 全流程终极时序图(完整闭环)
第十部分 全局核心规则总结(避坑速查)
Qt 5.9.9 + MSVC2015 64bit + qmake 超详细全流程手册
基于 Windows 平台,从工程概念、工具原理、文件细节、命令行参数、编译链路、内存布局、报错根源、增量编译、影子构建、调试部署、清理运维做逐层拆解,覆盖每一个隐性动作、底层逻辑、约束规则,做到无死角说明。
统一环境基线
- 操作系统:Windows 10/11 64 位
- Qt 版本:Qt 5.9.9
- 编译套件:
Desktop Qt 5.9.9 MSVC2015 64bit- 构建系统:qmake + jom(Qt 默认,替代微软 nmake)
- 编译器:MSVC2015
cl.exe(C/C++ 前端)- 链接器:MSVC2015
link.exe- 附属工具:Qt (moc/uic/rcc)、MSVC (rc.exe)、部署 (windeployqt)
- 工程类型:Qt Widgets GUI 应用程序
第一部分 基础概念 & 工程文件全景(人工阶段)
1.1 整套工具链分工(底层定位)
先区分两大阵营,全程互不混淆:
- Qt 预处理工具(跨平台,和编译器无关)
uic.exe:UI 界面编译器rcc.exe:资源编译器moc.exe:元对象编译器(Qt 信号槽核心)
- MSVC 原生工具链(Windows 专属编译 / 链接)
jom.exe/nmake.exe:任务调度器(解析 Makefile,串行 / 并行执行命令)cl.exe:C/C++ 代码编译器(源码 → 目标文件)link.exe:链接器(目标文件 + 库 → 可执行程序)rc.exe:Windows 原生资源编译器(图标、版本、清单)
- 辅助工具
qmake.exe:工程配置生成器(.pro → Makefile)windeployqt.exe:Qt 依赖部署工具
1.2 工程目录结构(影子构建,Qt 标准规范)
Qt 强制使用影子构建(Shadow Build),目的:源码目录纯净、多编译模式 / 多套件隔离、防止中间文件污染源码。
目录分层
plaintext
DemoProject/ # 项目根目录(源码根目录) ├─ Demo.pro # qmake 工程配置文件 ├─ main.h / main.cpp # 业务源码 ├─ mainwindow.h / .cpp # 窗口类源码(含 Q_OBJECT) ├─ mainwindow.ui # 界面 XML 文件 ├─ res.qrc # Qt 资源文件 ├─ app.rc # Windows 原生资源文件(可选) └─ Demo.pro.user # Qt Creator 本地用户配置(仅IDE使用) build-Demo-MSVC2015-Debug/ # Debug 构建目录(影子目录1) build-Demo-MSVC2015-Release/# Release 构建目录(影子目录2)- 源码目录:仅存放手写 / IDE 生成的原始文件,编译全程不产生任何中间文件。
- 构建目录:所有预处理代码、目标文件、exe、调试文件、日志全部生成在这里。
- 切换 Debug/Release、切换 x86/x64、切换 MSVC/MinGW 都会生成独立构建目录,完全隔离。
1.3 逐个文件深度详解
1.3.1.pro工程文件(qmake 核心配置文件)
本质:qmake 的脚本语言,描述工程模块、文件列表、编译规则、路径、宏、平台特性。
完整可运行示例(带全注释)
qmake
# ===================== 1. 基础工程配置 ===================== TEMPLATE = app # 工程类型:app=可执行程序;lib=库;subdirs=多子工程 TARGET = DemoApp # 最终生成的 exe 名称 CONFIG += qt warn_on # 启用Qt、启用编译警告 CONFIG -= console # 关闭控制台窗口(GUI程序必备) # ===================== 2. 依赖 Qt 模块 ===================== # Qt5 必须显式声明依赖模块,缺模块直接编译失败 QT += core gui widgets # ===================== 3. 源码/资源文件列表 ===================== # C++ 源文件 SOURCES += \ main.cpp \ mainwindow.cpp # C++ 头文件 HEADERS += \ mainwindow.h # UI 界面文件(Qt Designer 生成) FORMS += \ mainwindow.ui # Qt 资源文件(图片、样式、字体) RESOURCES += \ res.qrc # Windows 原生资源文件(图标、版本、manifest,可选) RC_FILE += app.rc # ===================== 4. 路径配置(可选) ===================== INCLUDEPATH += ./include # 自定义头文件目录 LIBS += -L./lib -lThirdLib # 第三方库目录+库名 # ===================== 5. 平台区分配置(Windows 专属) ===================== win32 { # Windows 平台额外配置 DESTDIR = bin # 最终exe输出到 bin 目录 }关键约束
- 文件列表换行必须用
\续行符; QT += xxx漏写模块,会出现头文件找不到、链接缺失符号;- 修改
.pro文件后,必须重新执行 qmake,否则新配置不生效。
1.3.2.h头文件(重点:Q_OBJECT 宏规则)
Qt 类只要满足以下任意一条,必须加Q_OBJECT:
- 使用
signals信号、slots槽函数; - 使用
Q_PROPERTY动态属性; - 需要运行时类型识别、动态反射。
强制规则(高频报错点)
Q_OBJECT只能写在头文件的类定义内部,不能写在.cpp里;- 类必须直接 / 间接继承 QObject(QWidget、QMainWindow、QDialog 都满足);
- 包含
Q_OBJECT的头文件,必须被 moc 单独处理。
示例标准头文件:
cpp
运行
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "ui_mainwindow.h" // uic 后续生成的 UI 头文件 class MainWindow : public QMainWindow { Q_OBJECT // 触发 moc 代码生成,位置固定在类内部第一行附近 public: explicit MainWindow(QWidget *parent = nullptr); // 信号:仅声明,实现由 moc 自动生成 signals: void dataChanged(int val); // 槽函数:声明+开发者实现 public slots: void onBtnClicked(); private: Ui::MainWindow ui; // 嵌入UI类,关联拖拽的所有控件 }; #endif // MAINWINDOW_H1.3.3.cpp源文件
标准 C++ 实现文件,编写业务逻辑、槽函数实现、构造函数。 构造函数中必须调用ui.setupUi(this),加载 uic 生成的界面代码。
1.3.4.ui界面文件
本质:XML 格式文本文件,Qt Designer 拖拽控件时,实时写入控件坐标、大小、文本、布局、样式、对象名。 开发者不需要手写界面代码,由uic翻译成标准 C++。
1.3.5.qrcQt 资源文件
XML 格式,作用:将外部图片、QSS、字体、配置文件打包进程序内部,脱离外部文件依赖。 核心特性:Qt 虚拟文件系统:/,代码中通过:/前缀/文件名访问资源。
示例:
xml
<RCC> <!-- prefix 虚拟路径前缀 --> <qresource prefix="/images"> <file>logo.png</file> <file>icon.png</file> </qresource> </RCC>代码访问:QPixmap(":/images/logo.png")
1.3.6.rcWindows 原生资源文件(可选)
MSVC 专属资源脚本,用于设置:程序图标、文件版本、公司名称、产品描述、UAC 权限清单 (manifest)。 编译后生成.res二进制资源,最终嵌入 EXE。
1.3.7.pro.user文件
Qt Creator 专属本地配置文件,XML 格式,内容包括:
- 当前选中的编译套件、编译模式;
- 断点、书签、运行参数、环境变量;
- 窗口布局、项目视图配置。完全不参与编译、不参与链接,删除后仅重置 IDE 配置,工程不受影响。
第二部分 阶段 1:qmake 生成编译规则(从 .pro → Makefile)
2.1 执行时机与命令
进入构建目录执行(Qt Creator 后台自动执行):
bash
运行
# 进入构建目录 cd build-Demo-MSVC2015-Release # 读取上级目录的 .pro 文件,生成 MSVC 格式 Makefile qmake ../Demo.pro