上个月去客户现场部署一台工控机,我双击程序 exe 后没有任何反应,任务管理器里进程闪一下就没了。同事很笃定地说代码在开发机上跑得好好的。我打开事件查看器,里面写得很清楚:错误模块 Qt5Widgets.dll。那台机器是刚装完的 Windows 7 精简版,连微软 VC++ 运行库都没有,更别说 Qt 的运行环境了。
这件事一直让我印象很深。很多用 VS2015 做 QT5 开发的朋友,都在“程序发布”这一步反复卡壳:拷贝一个 Release 版 exe 发过去,客户说打不开,或者在那边缺这个 dll、缺那个插件。原因其实不复杂,VS2015+QT5 的程序并不是绿色软件,exe 只是入口,背后还挂着一整套依赖链。下面就把我在这个组合上做发布部署的经验完整理一遍,包括依赖结构、windeployqt 的标准用法、新电脑上打不开时的排查套路,以及最容易翻车的 VC++ 运行库问题,最后给出一份我平时发布前会做的验证清单。这套经验适合所有用 VS2015+Qt5 做 Windows 桌面程序、并且需要把成品交付给别人的开发者。
1. 为什么VS2015+QT5的发布不是复制exe这么简单
1.1 exe只是入口,真正的程序由一堆动态库和插件拼起来
VS2015 里新建的 Qt Widgets 项目,默认使用的是动态链接。你在项目属性里能看到“运行库”一项通常是“多线程 DLL(/MD)”,这意味着编译器不会把 C/C++ 运行时代码整个塞进 exe,而是让 exe 在启动时动态加载 msvcp140.dll、vcruntime140.dll 这一类系统级运行库。
Qt 框架本身也是一堆动态库。一个最简单的窗口程序,至少需要 Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll。如果你用了网络、数据库、多媒体等模块,对应的 Qt5Network.dll、Qt5Sql.dll、Qt5Multimedia.dll 也会被加进依赖列表。这些 dll 彼此之间还有依赖关系,比如 Qt5Widgets.dll 内部又要调用 Qt5Gui.dll 里的导出函数,整条链像一串珠子,断一颗整串就散。
开发机能正常跑,是因为你的 PATH 环境变量里通常有 Qt 的 bin
