Qt程序不能靠复制.exe了事,必须用windeployqt收齐依赖再用Inno Setup打包成setup.exe,否则用户双击会报“找不到平台插件”或白屏;windeployqt必须严格匹配编译器和Qt版本,混用将导致DLL版本不兼容、程序无法启动。

直接说结论:Qt程序不能靠复制.exe了事,必须用 windeployqt 收齐依赖,再用 Inno Setup 打包成 setup.exe;否则用户双击就报“找不到平台插件”或白屏——这不是bug,是缺文件。
windeployqt 必须匹配编译器和Qt版本
很多人打包后在客户电脑上启动黑屏,第一反应是Inno脚本写错了,其实90%问题出在这步。你用 MSVC 2019 编译的 Qt6 程序,就必须用 “Qt 6.x.x (MSVC 2019 64-bit)” 命令行运行 windeployqt6;用 MinGW 就得选对应 MinGW 版本的命令行。混用会导致 Qt6Core.dll 和 Qt6Gui.dll 版本不兼容,安装包装完也起不来。
常见错误现象:
- 命令行报错
Failed to load platform plugin "windows" - 程序窗口一闪而逝,任务管理器里进程存在但无界面
- 手动双击
platforms\qwindows.dll提示“不是有效的 Win32 应用程序”(32/64位错配)
实操建议:
- 先确认你的
.exe是 32 还是 64 位:file YourApp.exe(用 Git Bash)或右键属性 → 详细信息 → “位数” - 执行前务必
cd /d D:\YourReleaseFolder,且路径不含中文、空格、括号 - QML 程序必须加
--qmldir参数,否则QtQuick.Controls模块加载失败 - 加
--no-opengl-sw避免误带软件渲染库(除非你真需要)
Inno Setup 脚本里 platform 文件夹不能漏
Inno Setup 默认只复制文件,不会自动保留子目录结构。如果你用 “Add folder” 把整个发布目录拖进去,却没在脚本里显式声明 platforms 目录,安装后 platforms\qwindows.dll 就会跑到安装根目录下,Qt 启动时根本找不到它。
关键配置点:
-
[Files]段里,对platforms必须单独写一行:Source: "platforms\*"; DestDir: "{app}\platforms"; Flags: ignoreversion recursesubdirs createallsubdirs -
imageformats\qpng.dll、styles\qwindowsvistastyle.dll同理,不能只靠“Add folder”偷懒 - 如果用了 Qt Quick Controls 2,还要确保
qml\QtQuick\Controls.2\*.*和qml\QtQuick\Templates.2\*.*全部复制到安装目录的qml子目录下
否则现象是:界面能出来,但按钮没样式、图标不显示、QML组件报 module "QtQuick.Controls" is not installed。
VC++ 运行库和 Qt 插件要分开处理
windeployqt 只管 Qt 自家 DLL,不管 MSVC 运行库。VS2022 编译的程序,目标机器没装 Microsoft.VC143.CRT,启动直接弹窗报错 0xc000007b 或 api-ms-win-crt-runtime-l1-1-0.dll is missing。
解决方案分两路:
- 静态链接 MSVCRT(推荐):在
.pro文件加QMAKE_LFLAGS += /MT,重编 Release,这样生成的.exe不再依赖外部 VC++ DLL - 动态分发:用 Inno 的
[Run]段静默安装vcredist_x64.exe,但要注意:必须加architecturesinstall=amd64参数限制只在64位系统运行,否则32位机器会卡住
另一个坑是 Qt 插件路径硬编码。如果用户自定义安装路径,qwindows.dll 找不到照样崩溃。解决办法是在发布目录放一个 qt.conf 文件,内容仅两行:
[Paths] Plugins = plugins
注意:这个文件必须跟 .exe 同级,且 Inno 脚本里要把它一起复制过去。
最常被忽略的一点:打包完别急着发给客户,先在一台干净的 Windows 虚拟机里测试——不装 Qt、不装 VS、不装任何开发工具,只装你的 setup.exe。连这一步都过不了,说明依赖还没收全。











