文章前言
作为 Qt 新手写完代码后,本地能正常运行,把生成的 exe 拷贝到其他电脑就报「找不到 Qtxx.dll」;还有人打包工具选错弹出广告、Ninja 编译报错、命令行找不到windeployqt等一系列问题。本文基于Qt 6.5.3 + MinGW64 + CMake记录完整流程,包含代码编写、编译、依赖部署、单文件封装,附带所有踩坑解决方案,适配工控上位机、固件差分升级工具这类 Windows 桌面 Qt 开发场景,新手可一键照搬操作。
开发环境
- Qt 版本:Qt 6.5.3 MinGW 64-bit
- IDE:Qt Creator
- 构建工具:CMake(规避 qmake 旧方案)
- 打包工具:Enigma Virtual Box(免费无广告、商用无限制)
- 系统:Windows 10/11
一、新建 Qt Widgets CMake 项目
1. 新建工程模板
- Qt Creator 点击「新建项目或文件」,分类选择
Application (Qt)→Qt Widgets Application(传统桌面控件,工控工具首选) - 项目名称必须纯英文、无空格、无中文,存放路径全程英文(MinGW+CMake 对中文路径兼容性极差)
- 构建套件选择
Desktop Qt 6.5.3 MinGW 64-bit,一路点击下一步,完成项目创建。
2. 项目文件结构说明
自动生成文件:
CMakeLists.txt:CMake 构建配置文件(Qt6 核心配置文件)main.cpp:程序入口mainwindow.h/cpp/ui:主窗口代码 + 可视化 UI 设计文件
3. 编写测试示例代码(按钮窗口 Demo)
这里用极简纯代码示例测试,可直接替换main.cpp全部内容:
cpp
运行
#include <QApplication> #include <QWidget> #include <QVBoxLayout> #include <QPushButton> #include <QDebug> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget *window = new QWidget; window->resize(300, 150); QVBoxLayout *layout = new QVBoxLayout(window); QPushButton *button = new QPushButton("点击我"); layout->addWidget(button); // 信号槽绑定按钮点击事件 QObject::connect(button, &QPushButton::clicked, [](){ qDebug() << "按钮被点击,程序运行正常!"; }); window->show(); return app.exec(); }4. 校验 CMakeLists 配置(Qt6 必做)
Qt6 CMake 必须手动声明依赖模块,完整可用配置:
cmake
cmake_minimum_required(VERSION 3.5) project(QTTest LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) # 引入Qt核心+Widgets桌面控件模块 find_package(Qt6 REQUIRED COMPONENTS Core Widgets) # 罗列所有源码、UI文件 qt_add_executable(QTTest main.cpp mainwindow.h mainwindow.cpp mainwindow.ui ) # 链接Qt库 target_link_libraries(QTTest PRIVATE Qt6::Core Qt6::Widgets)二、编译 Release 正式版本(关键!Debug 版本无法外发)
1. 切换构建模式
Qt Creator 左下角构建下拉框,把默认Debug切换为Release:
- Debug:带调试信息、体积大、依赖调试库,仅本地开发调试,不能发给别人
- Release:无调试冗余、体积精简,是最终发布版本
2. 清理旧缓存 + 重新构建
- 顶部菜单栏:
构建→清理所有项目 - 手动删除项目根目录下
build整个文件夹(彻底清除 Ninja 残留缓存,规避编译报错) - 点击锤子图标「构建全部项目」,底部无红色报错即编译成功。
3. 找到原生 EXE 文件
EXE 路径:项目目录/build/Desktop_Qt_6_5_3_MinGW_64_bit-Release/QTTest.exe⚠️ 此时直接单独拷贝这个 exe 到其他电脑,会提示缺失 dll,无法运行,必须部署依赖。
三、windeployqt 一键部署 Qt 运行依赖
1. 打开正确的 Qt 专属终端(高频踩坑点)
❌ 错误:系统 CMD、独立 TDM-GCC 终端,环境变量不全,提示windeployqt不是内部或外部命令✅ 正确操作:Windows 开始菜单找到Qt 6.5.3 MinGW 64-bit Command Prompt,该终端自动加载完整 Qt 环境。
2. 跳转 EXE 所在目录并执行部署命令
终端依次输入两行指令,每行回车执行:
cmd
cd /d D:\Desktop\xuexi\QTProject\QTTest\build\Desktop_Qt_6_5_3_MinGW_64_bit-Release windeployqt QTTest.exe3. 部署完成标志
Release 文件夹内自动生成所有 Qt 依赖 dll、platforms、styles插件目录。此时整个 Release 文件夹直接压缩打包,发给任意 Windows 电脑解压后双击 exe 就能运行,无需额外安装 Qt。
四、进阶:封装为单个独立 EXE(无广告)
多文件夹发给客户不方便,用免费工具打包成单个 exe,注意区分两款极易混淆的同厂软件:
表格
| 工具 | 用途 | 授权 | 注意事项 |
|---|---|---|---|
| Enigma Virtual Box | 多文件打包单 EXE,仅虚拟挂载依赖 | 永久免费、商用无限制 | 无任何弹窗水印,本文推荐 |
| Enigma Protector | 程序加密、授权加壳工具 | 付费软件,试用版强制弹开屏广告 | ❌ 绝对不要下载使用 |
1. 官方正版下载
官网下载页:Software Protection, Software Licensing, Software Virtualization仅下载Enigma Virtual Box(Freeware),不要勾选上方 Protector 付费工具。
2. EVB 打包详细步骤
- 打开 Enigma Virtual Box:
Enter input file name:选中部署好依赖的原始QTTest.exeEnter output file name:自定义打包后单 exe 保存路径 + 文件名
- 点击
Add Folder Recursively,选中整个 Release 文件夹,一键导入全部 dll、子目录; - 可选勾选
Compress files开启压缩,减小最终 exe 体积; - 右下角点击
Process,等待打包结束。
3. 最终成品
生成的单个 exe 文件,直接发给其他人,双击即可运行,无任何弹窗、无需解压、无需安装运行库。
五、全程高频踩坑解决方案(你实操遇到的全部问题汇总)
坑 1:ninja: build stopped: subcommand failed 编译失败
- 手动删除整个 build 构建文件夹,清理缓存;
- 套件管理里把 CMake 生成器从
Ninja改成Unix Makefiles (MinGW make); - 检查
CMakeLists.txt是否添加了Qt6::Widgets模块依赖。
坑 2:windeployqt 不是内部或外部命令
不要用系统 CMD、TDM-GCC 独立终端,必须使用 Qt 安装自带的Qt 6.5.3 MinGW 64-bit Command Prompt终端执行命令。
坑 3:打包后启动弹出 Enigma 开屏广告
选错工具,使用了付费试用版Enigma Protector;删除带广告的 exe,换回免费Enigma Virtual Box重新打包。
坑 4:拷贝 exe 到其他电脑提示缺失 dll
只单独复制了 exe,没有用windeployqt部署依赖;要么完整发送整个 Release 文件夹,要么 EVB 打包成单文件。
坑 5:CMake 构建解析失败
项目路径、文件名包含中文、空格、特殊字符,MinGW+CMake 不兼容,必须全程英文路径。
六、流程完整复盘 & 项目适配建议
完整流程一句话总结
新建英文路径 CMake Widget 项目 → 编写代码 + 校验 CMake 配置 → 切换 Release 模式编译 → Qt 专属终端执行 windeployqt 部署依赖 → 文件夹可直接交付 / EVB 打包单 EXE 交付。
适配你的固件差分升级工具开发建议
- 正式差分工具依旧使用 Qt Widgets 拖拽 UI 开发,效率更高;
- 每次迭代新版本都走这套 Release 打包流程,交付给设备调试人员;
- 工控现场电脑普遍无 Qt 环境,优先打包单 EXE,拷贝即用,无需额外配置。