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