当前位置: 首页 > article >正文

Windeployqt 打包,缺少DLL 的原因分析,解决方法

很多同学使用工具windeployqt进行打包发布后,运行exe文件时,还是会出现下图所示的系统错误提示,这种情况就表示相关的DLL 库文件没有被正确打包。可是windeployqt明确显示运行正常啊,难道是QT自家的windeployqt这个工具有bug?显然不可能。下面就来分析一下问题的原因,并给出解决问题的详细步骤,相信大家看完后就会豁然开朗。
在这里插入图片描述
其实产生这个问题的原因很简单,就是很多同学在打包时,都是直接在windows 环境下打开cmd 命令行,然后执行指令windeployqt,运行时就会出现上图的错误。正确的做法应该是在QT提供的命令行环境下执行windeployqt,这两者有什么区别呢?

如下图步骤,在windows桌面搜索栏输入qt,按上下键选择相应的版本,此处选择Qt 6.4.1 for Desktop (MinGW 11.2.0 64-bit),然后选择【打开文件位置】
在这里插入图片描述

在打开的目录下面有一个相应的快捷方式图标:Qt 6.4.1 for Desktop (MinGW 11.2.0 64-bit)
在这里插入图片描述

右键点击此快捷文件,选择【属性】:
在这里插入图片描述

查看目标栏内容,此处内容为:

C:\Windows\System32\cmd.exe /A /Q /K E:\Qt\Qt6.4\6.4.1\mingw_64\bin\qtenv2.bat

看到这里就知道了,原来从QT环境打开命令行时,执行了一个批处理文件 qtenv2.bat,那这个文件里面干了什么呢?

在E:\Qt\Qt6.4\6.4.1\mingw_64\bin\ 目录,打开qtenv2.bat,其内容如下:

@echo off
echo Setting up environment for Qt usage...
set PATH=E:\Qt\Qt6.4\6.4.1\mingw_64\bin;E:\Qt\Qt6.4\Tools\mingw1120_64\bin;%PATH%
cd /D E:\Qt\Qt6.4\6.4.1\mingw_64

此处设置了windeployqt 运行时的环境变量PATH,它指定了2个bin目录,打包需要的DLL 库文件就在这2个bin目录里面。所以,从windows 环境直接打开命令行cmd.exe 时,是没有进行这个环境变量设置的,或者在其他地方设置了,但是可能没有生效。

接下来,我们从QT 进入命令行,验证一下。下图中,直接点击选项 2【Qt 6.4.1 for Desktop (MinGW 11.2.0 64-bit),进入命令行环境
在这里插入图片描述

在命令行手动输入打包指令,回车运行…
在这里插入图片描述

指令运行完毕后如下图:红框3 显示指令执行正常,红框1,2 就是新增加的库文件。
在这里插入图片描述

此时,双击运行LangSwitch.exe,如下图所示,运行正常,说明整个打包的过程是正确的。
在这里插入图片描述

通过以上分析和验证,可以得出结论:

从windowds 直接打开cmd 进入命令行时,没有设置环境变量PATH,windeployqt 自然就无法找到相应的DLL 库文件,最后导致错误发生。

所以,正确的做法应该是从QT环境进入命令行,然后再手动输入执行windeployqt 就不会有问题了.


现在DLL缺失的问题是解决了,但是如果每次执行windeployqt 打包时,都要手动输入类似下面的一长串字符,真的是有点烦。

E:\Qt\Qt6.4\6.4.1\mingw_64\bin>windeployqt.exe E:\Qt\Qt6source\CH15\CH1502\LangSwitch\release\LangSwitch.exe

那有没有什么其它的工具,避免这个烦人的事情呢? 答案是:QT没有

然鹅,但是,但是,,,,,

QT没有,不代表我们就要一直受这个鸟气,经过本人研究,还真的琢磨出一个曲线救国的好办法,不需要打开命令行cmd,也不需要输入任何字符,只要点一下鼠标,就可以一键完成打包的所有动作,也就是说,只要是有手的人,就可以完成打包,真正的傻瓜式操作,绝对可靠。有兴趣的同学,请参考本人以下链接文章【windeployqt实现一键打包的方法】:

https://blog.csdn.net/zchill/article/details/128974201


http://www.kler.cn/a/17248.html

相关文章:

  • AtomicInteger 和 AtomicIntegerFieldUpdater的区别
  • 大数据 ETL + Flume 数据清洗 — 详细教程及实例(附常见问题及解决方案)
  • 第二节 OSI-物理层
  • 品融电商:新形势下电商平台如何助力品牌长期经营
  • git之 revert和rebase
  • 管家婆财贸ERP BB045.销售批量收款
  • 【网络】网络基础入门
  • Bean的作用域和生命周期
  • Splunk 转移数据之collect 命令
  • 功能齐全的 DIY ESP32 智能手表设计之PCB介绍
  • 一篇带你快速入门DDD领域驱动设计
  • 【JavaEE初阶】简单了解wait和notify方法~
  • MySQL 精选 35 道面试题大厂稳了(含答案)
  • 真无线耳机哪款性价比高?高性价比无线耳机排行榜
  • Apache POI,springboot中导出excel报表
  • Websocket的基本认识、使用与封装
  • JavaScript:数组---二分法
  • 【笔试强训选择题】Day7.习题(错题)解析
  • 看我如何通过帮助服务台轻松黑掉数百家公司
  • selenium自动化面试题回答
  • KeepAlived高可用环境搭建
  • JavaScript:二叉树(层序遍历)
  • Python | 人脸识别系统 — 人脸识别
  • Linux线程:互斥锁mutex的使用
  • 什么是Spring FactoryBean?有什么作用?
  • ES6:promise简单学习