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

前情提要

众所周知,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)
请添加图片描述

进两步分析

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

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

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

请添加图片描述
注意目标(T)处代码

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

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

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

我们来看看其中的内容:

@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命令行环境

Peace

### 关于 `windeployqt` 打包缺少 DLL 的解决方案 当使用 `windeployqt` 工具进行 QT 应用程序打包时,可能会遇到某些动态链接库(DLL)未被正确复制到目标目录的情况。以下是针对该问题的详细分析和解决方法: #### 1. **确认 Qt 版本与环境匹配** 如果将打包后的可执行文件部署到没有安装 Qt 的环境中仍无法正常运行,则可能是由于使用的 Qt 版本不兼容所致[^2]。因此,在开始打包之前,请确保开发机器上的 Qt 版本与目标系统的版本一致。 #### 2. **手动指定插件路径** 有时默认情况下 `windeployqt` 可能不会自动检测并复制所有的必需组件。可以通过以下方式来增强其功能: - 使用 `-dir` 参数自定义输出目录。 - 明确添加额外所需的模块或插件,例如通过参数 `--qmldir` 来处理 QML 文件及其依赖项。 示例命令如下所示: ```bash windeployqt --verbose 1 --qmldir path/to/qml/files output/exe/file.exe ``` 此处 `path/to/qml/files` 是指存储 QML 脚本的位置;而 `output/exe/file.exe` 则代表最终生成的应用程序入口点[^4]。 #### 3. **调整 Visual Studio 配置** 对于基于 Microsoft Visual Studio 构建的项目来说,可能还需要特别注意编译器配置方面的影响因素。比如切换至旧版插件支持工具链可以帮助改善一些特定场景下的行为表现[^3]。 具体操作步骤包括但不限于: - 卸载当前最新版的 *Qt Visual Studio Tools*; - 安装较早版本即所谓的 *Legacy Qt Visual Studio Tools*; - 更新项目的 C/C++ 和 Linker 属性设置以适应新的构建需求。 #### 4. **验证所有必要的依赖关系** 即使经过上述措施之后仍有遗漏情况发生的话,建议采用第三方工具如 Dependency Walker 或 Process Explorer 对 EXE 进行深入剖析,找出那些尚未满足的要求条件,并手工补充相应资源文件进去。 --- ### 提供一段 Python 脚本来辅助检查失的 dlls (可选) 下面给出了一段简单的 python 脚本用于扫描给定 exe 文件所依赖却不存在本地磁盘中的任何外部共享对象/动态连接库: ```python import os, sys from ctypes import CDLL def find_missing_dlls(exe_path): try: cdll.LoadLibrary(exe_path) print(f"All dependencies found for {exe_path}.") except OSError as e: error_message = str(e).split(' ')[-1].strip("'") if ".dll" in error_message.lower(): missing_dll = error_message.split(":")[0] print(f"The following DLL is missing: {missing_dll}") if __name__ == "__main__": if len(sys.argv) != 2: print("Usage: python check_dll.py <path_to_exe>") sys.exit(1) exe_file = sys.argv[1] if not os.path.isfile(exe_file): print(f"{exe_file} does not exist.") sys.exit(1) find_missing_dlls(exe_file) ``` 此脚本接受单个参数——待测试的目标 .exe 文件全名连同完整路径一起传入即可工作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值