windeployqt发布项目 为何总是缺少dll
本文最后更新于:2022年1月19日 晚上
前情提要
众所周知,Qt直接编译产生的exe文件很难在其他电脑中运行
其根源在于Qt采用动态链接,所依赖的函数与类等,封装在dll(动态链接库·Dynamic Link Library)中
所以,单单复制exe文件,会导致缺失dll依赖库,致使无法正确运行
知道了问题所在,解决方法也是一目了然,只要将exe同dll依赖库一齐打包即可
由于手动寻找依赖库极其不便,Qt贴心地提供了部署工具windeployqt
Usage・偽
[由于windeployqt现已加入Windows豪华环境变量]
所以只要在CMD中改变(cd·Change Directory)工作目录至exe所在目录
并执行windeployqt test.exe
便会自动将依赖文件(包括dll和图标等众文件)拷贝至exe所在目录
此时,打包为压缩包并一齐发布即可
Pause
真有这么简单?
是的,我就是这么干的,然后课上Presentationの時疯狂“缺失dll”
直接社死
分析
这究竟是人性的扭曲还是道德的沦丧
这显然是 复制了但没有完全复制
社死的我回到座位上开始找度娘
度娘的做法和我稍稍、削削有那么一点点 不同
不是Windows自带CMD而是Qt提供的命令行环境:Qt 5.14.2 (MinGW 7.3.0 64-bit)

进两步分析
那莫,这俩究竟有何区别,造成最终拷贝的dll数量不相同呢
我们先来看看 Qt 5.14.2 (MinGW 7.3.0 64-bit) 究竟是何方神圣
实际上这玩意儿是个link(快捷方式)

注意目标(T)处代码
1 | |
实际上是调用CMD执行了qtenv2.bat(批处理文件)
那么,猫腻也许就藏在这个bat文件中
我们来看看其中的内容:
1 | |
其实真正能够造成影响的是第3行的set PATH中的第二个path(E:/Qt5.14.2/Tools/mingw730_64\bin)
因为第一个path其实已经默认加入了环境变量 无伤大雅
而path(E:/Qt5.14.2/Tools/mingw730_64\bin)中并不在环境变量中,导致一般的CMD方式无法读取其中的dll,导致dll缺失
Last And Absolutely Last
真相了,就缺这么一个目录,少了一堆dll
下次记得用Qt命令行环境
哦 对了 如果使用Enigma Virtual Box封包
记得不要拖入文件夹!而是拖入文件(without exe)
否则【cannot load library Qt5Core.dll】!!
Peace