windeployqt发布项目 为何总是缺少dll

本文最后更新于:2022年1月19日 晚上

前情提要

众所周知,Qt直接编译产生的exe文件很难在其他电脑中运行

其根源在于Qt采用动态链接,所依赖的函数与类等,封装在dll(动态链接库·Dynamic Link Library)

所以,单单复制exe文件,会导致缺失dll依赖库,致使无法正确运行

知道了问题所在,解决方法也是一目了然,只要将exedll依赖库一齐打包即可

由于手动寻找依赖库极其不便,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)

Qt 5.14.2 (MinGW 7.3.0 64-bit)

进两步分析

那莫,这俩究竟有何区别,造成最终拷贝的dll数量不相同呢

我们先来看看 Qt 5.14.2 (MinGW 7.3.0 64-bit) 究竟是何方神圣

实际上这玩意儿是个link(快捷方式)

Qt命令行属性

注意目标(T)处代码

1
C:\Windows\System32\cmd.exe /A /Q /K E:\Qt5.14.2\5.14.2\mingw73_64\bin\qtenv2.bat

实际上是调用CMD执行了qtenv2.bat(批处理文件)

那么,猫腻也许就藏在这个bat文件中

我们来看看其中的内容:

1
2
3
4
@echo off
echo Setting up environment for Qt usage...
set PATH=E:\Qt5.14.2\5.14.2\mingw73_64\bin;E:/Qt5.14.2/Tools/mingw730_64\bin;%PATH%
cd /D E:\Qt5.14.2\5.14.2\mingw73_64

其实真正能够造成影响的是第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


windeployqt发布项目 为何总是缺少dll
https://mrbeancpp.github.io/2021/09/17/windeployqt发布项目-为何总是缺少dll/
作者
MrBeanC
发布于
2021年9月17日
许可协议