)
文章前言作为 Qt 新手写完代码后本地能正常运行把生成的 exe 拷贝到其他电脑就报「找不到 Qtxx.dll」还有人打包工具选错弹出广告、Ninja 编译报错、命令行找不到windeployqt等一系列问题。本文基于Qt 6.5.3 MinGW64 CMake记录完整流程包含代码编写、编译、依赖部署、单文件封装附带所有踩坑解决方案适配工控上位机、固件差分升级工具这类 Windows 桌面 Qt 开发场景新手可一键照搬操作。开发环境Qt 版本Qt 6.5.3 MinGW 64-bitIDEQt Creator构建工具CMake规避 qmake 旧方案打包工具Enigma Virtual Box免费无广告、商用无限制系统Windows 10/11一、新建 Qt Widgets CMake 项目1. 新建工程模板Qt Creator 点击「新建项目或文件」分类选择Application (Qt)→Qt Widgets Application传统桌面控件工控工具首选项目名称必须纯英文、无空格、无中文存放路径全程英文MinGWCMake 对中文路径兼容性极差构建套件选择Desktop Qt 6.5.3 MinGW 64-bit一路点击下一步完成项目创建。2. 项目文件结构说明自动生成文件CMakeLists.txtCMake 构建配置文件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 必须手动声明依赖模块完整可用配置cmakecmake_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切换为ReleaseDebug带调试信息、体积大、依赖调试库仅本地开发调试不能发给别人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 所在目录并执行部署命令终端依次输入两行指令每行回车执行cmdcd /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 BoxFreeware不要勾选上方 Protector 付费工具。2. EVB 打包详细步骤打开 Enigma Virtual BoxEnter input file name选中部署好依赖的原始QTTest.exeEnter output file name自定义打包后单 exe 保存路径 文件名点击Add Folder Recursively选中整个 Release 文件夹一键导入全部 dll、子目录可选勾选Compress files开启压缩减小最终 exe 体积右下角点击Process等待打包结束。3. 最终成品生成的单个 exe 文件直接发给其他人双击即可运行无任何弹窗、无需解压、无需安装运行库。五、全程高频踩坑解决方案你实操遇到的全部问题汇总坑 1ninja: build stopped: subcommand failed 编译失败手动删除整个 build 构建文件夹清理缓存套件管理里把 CMake 生成器从Ninja改成Unix Makefiles (MinGW make)检查CMakeLists.txt是否添加了Qt6::Widgets模块依赖。坑 2windeployqt 不是内部或外部命令不要用系统 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 打包成单文件。坑 5CMake 构建解析失败项目路径、文件名包含中文、空格、特殊字符MinGWCMake 不兼容必须全程英文路径。六、流程完整复盘 项目适配建议完整流程一句话总结新建英文路径 CMake Widget 项目 → 编写代码 校验 CMake 配置 → 切换 Release 模式编译 → Qt 专属终端执行 windeployqt 部署依赖 → 文件夹可直接交付 / EVB 打包单 EXE 交付。适配你的固件差分升级工具开发建议正式差分工具依旧使用 Qt Widgets 拖拽 UI 开发效率更高每次迭代新版本都走这套 Release 打包流程交付给设备调试人员工控现场电脑普遍无 Qt 环境优先打包单 EXE拷贝即用无需额外配置。