windows系统下QT打包后到不同系统的各种报错问题分析

最近碰到好多人问关于WINDOWS上的QT打包后在自己电脑上可以运行,换台电脑报各种错误的问题。于是特地写个帖子总结下一些问题:

首先是打包QT,将QT的系统库拉出来。
这里可以借用windeployqt工具。
打包参考(其他平台打包也可以用对应平台的这个工具):
https://blog.youkuaiyun.com/DFSAE/article/details/78615121

他是QT目录下的工具,但他会把对应的QT相关的库文件都拉过来。所以也要注意工具拉的位数,比如我用msvc2017_64\bin和msvc2017_32\bin下的windeployqt.exe打包出来库的位数是不一样的,不过32位的库可以跑在64位上。

其实后面很多报错都是出在系统位数上。

错误1:在这里插入图片描述

报错:

无法启动此程序,因为计算机中丢失MSVCR120.dll。尝试重新安装台程序已解决此问题。

错误2:

报错:

无法启动此程序,因为计算机中丢失vcruntimexxx.dll。尝试重新安装台程序已解决此问题。

原因:

其实这两个错误的本质是一样的。都是VC相关的库,和软件用VS编译有关的库,对应的版本也不一样。应该是要部署的机子上的这个库被阉割了或者丢失了这样的。

<think> 我们正在讨论的问题是:QT打包的exe在其他Windows系统上运行报错,提示“没有指定的windows”。根据引用内容,我们可以推断问题可能出在缺少必要的依赖文件或环境配置上。 引用[3]提到,Windows下可以使用windeployqt.exe工具自动复制运行所需的Qt库DLL、插件、翻译文件等到exe所在目录。而引用[1]则指出,导入包的名字与打包后的文件名不一致(例如QtCore.dll变成了Qt5Core.dll)可能导致错误。 因此,解决该问题的思路是: 1. 确保使用windeployqt.exe正确地收集了所有依赖文件。 2. 检查打包后的文件命名是否与程序引用的名称一致。 3. 确保目标系统上安装了必要的运行时库(如VC++运行库)。 以下是具体步骤: ### 步骤1:使用windeployqt工具打包 1. 打开Qt命令行(确保环境变量设置正确,以便使用windeployqt)。 2. 进入生成的exe文件所在目录(例如release目录)。 3. 运行命令:`windeployqt 你的程序名.exe` - 例如:`windeployqt myapp.exe` 这个命令会自动将所需的Qt库、插件等复制到当前目录。 ### 步骤2:检查文件名一致性 打开生成的exe所在目录,检查是否存在类似于Qt5Core.dll、Qt5Gui.dll的文件。然后,检查你的程序在运行时是否使用了正确的文件名。如果程序要求的是QtCore.dll,但实际存在的是Qt5Core.dll,那么需要调整程序导入的库名或者重命名这些文件。 根据引用[1],有时打包工具可能会生成带版本号的文件名(如Qt5Core.dll),而程序在导入时可能使用的是无版本号的文件名(QtCore.dll)。这种情况下,可以尝试: - 将Qt5Core.dll重命名为QtCore.dll,其他类似文件也进行同样处理。 - 或者修改程序代码,导入带版本号的库(但在PyQt5中,一般导入的是PyQt5模块,而不是直接导入dll,所以这个问题可能不直接出现在PyQt5程序,但如果是C++程序则可能出现)。对于PyQt5,我们通常使用PyInstaller打包,所以参考下面的步骤3。 ### 步骤3:使用PyInstaller打包PyQt5程序 如果使用PyQt5开发,通常使用PyInstaller打包。但根据引用[2],打包后可能出现“failed to execute script”错误。这可能是由于PyInstaller未能正确包含所有依赖文件。 可以尝试以下步骤: 1. 确保使用最新版本的PyInstaller(使用pip升级:`pip install --upgrade pyinstaller`)。 2. 尝试在打包时添加必要的选项,例如: ``` pyinstaller --onefile --windowed --hidden-import=PyQt5.QtCore --hidden-import=PyQt5.QtGui --hidden-import=PyQt5.QtWidgets your_script.py ``` 3. 如果上述方法不行,可以尝试在打包后手动添加缺少的dll文件。通常,PyInstaller打包后会在dist目录生成一个单独的exe文件(如果使用--onefile)或者一个包含所有依赖的目录(如果不使用--onefile)。在目录方式下,你可以检查是否有缺少的dll,特别是Qt相关的dll。 另外,注意引用[1]中提到的问题打包后的dll文件名可能与程序导入时预期的文件名不一致。因此,检查生成的dll文件名(例如:Qt5Core.dll, Qt5Gui.dll等)是否与程序导入时使用的文件名一致。如果不一致,重命名dll文件。 ### 步骤4:检查目标系统是否安装了必要的运行时 目标系统可能需要安装Visual C++运行库。例如,如果你的程序是用Visual Studio编译的,则需要安装对应版本的VC++运行库。 ### 步骤5:测试 在打包完成后,建议在没有安装Qt和Python的目标机器上进行测试。 综上所述,解决QT打包的exe在其他Windows系统上运行报错(提示没有指定的windows)的步骤主要是正确打包依赖文件并确保文件名一致,同时确保目标系统安装了必要的运行库。 §§相关问题§§ 1. 如何使用windeployqt工具打包Qt程序? 2. PyInstaller打包PyQt5程序时需要注意什么? 3. 如何解决PyInstaller打包后出现的“failed to execute script”错误? 4. 目标机器运行Qt程序需要哪些运行时环境? </think> ### QT打包的exe在其他Windows系统运行报错解决方案 #### 1. **确保动态库文件命名一致性** - **问题原因**:PyQt5导入的模块名(如`QtCore`)与打包后生成的动态库文件名(如`Qt5Core.dll`)不匹配 - **解决方案**: 1. 检查打包目录中的dll文件名,确认是否包含额外前缀(如`Qt5Core.dll`) 2. 手动重命名文件使其与代码导入名一致: ```bash ren Qt5Core.dll QtCore.dll ren Qt5Gui.dll QtGui.dll ren Qt5Widgets.dll QtWidgets.dll ``` [^1] #### 2. **使用官方部署工具自动补全依赖** - 运行Qt命令行工具,执行: ```bash windeployqt.exe --release <你的程序名>.exe ``` - 此命令会自动检测并复制以下必要文件到exe目录: - Qt核心库(`QtCore.dll`, `QtGui.dll`等) - 平台插件(`platforms/qwindows.dll`) - 图像格式插件(`imageformats/*.dll`) - VC++运行时库(`msvc*.dll`) [^3] #### 3. **关键依赖手动补充清单** 若报错持续,检查并手动添加以下文件到exe同级目录: | 文件类型 | 典型文件路径 | |------------------|---------------------------------------| | **平台插件** | `Qt\plugins\platforms\qwindows.dll` | | **OpenGL库** | `opengl32sw.dll`(软件渲染版本) | | **VC++运行时** | `vcruntime140.dll`, `msvcp140.dll` | | **Qt核心库** | `Qt5Core.dll`, `Qt5Gui.dll`等 | #### 4. **打包工具特殊配置(PyInstaller)** 若使用PyInstaller打包Python程序: - 添加隐藏导入: ```bash pyinstaller --hidden-import PyQt5.QtCore --hidden-import PyQt5.QtGui --onefile main.py ``` - 在spec文件中强制包含缺失库: ```python a = Analysis(... binaries=[('C:\\Qt\\bin\\qwindows.dll', 'platforms')], ) ``` #### 5. **目标系统环境验证** - 确保目标系统满足: - Windows 7 SP1及以上版本 - 安装[VC++ 2015-2022运行库](https://aka.ms/vs/17/release/vc_redist.x64.exe) - 非精简版系统(需包含`ucrtbase.dll`等基础组件) > **注意事项**:使用`Process Monitor`工具监控程序启动时的文件访问错误,可精准定位缺失文件[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值