[已解决] Python调用C++ Dll打包运行时报错 PyInstallerImportError: Failed to load dynlib/dll xxx.dll
- 1. 问题描述
- 2. 问题原因
- 3. 问题解决
- 博主热门文章推荐:
1. 问题描述
Python通过ctypes调用C++ Dll库,pyinstaller打包成exe后在本机正常运行,但是放到别的PC上单独运行就报错,提示:
PyInstallerImportError: Failed to load dynlib/dll xxxx.dll …
注:我这里是将该dll打包进了exe,但尝试把dll文件直接放入exe目录中 也同样报错
报错信息如下图:
![](https://img-blog.csdnimg.cn/f242ebb41c0c430face09c247b56858b.png)
Ctypes调用API没有问题,通过常规ctypes.cdll.LoadLibrary()或ctypes.CDLL():
dll路径方面也正确:
![在这里插入图片描述](https://img-blog.csdnimg.cn/da0f88e06ddf42ea9574c332f6b5db2e.png)
本机测试过程没有任何问题,所以当时就比较奇怪都打包进exe了,还会有这类DLL not found issue
2. 问题原因
最终发现问题 rootcause:
- 是由于该dll本身也有依赖,因此需要将dll在当前开发环境的依赖包,同样放到目标环境exe目录中(或直接打包进exe),才可以正确执行
否则就算将源码迁移到另一台机器,运行时也是报同样的错误,因为该dll依赖在目标机器系统内不支持
3. 问题解决
首先通过 dependencywalker 工具来查找该Dll的依赖包:
- https://www.dependencywalker.com/
下载后,打开depends.exe工具,将相关dll导入,即可找到所有依赖,
![在这里插入图片描述](https://img-blog.csdnimg.cn/60497f50f3d241cca79c37ac9fac274b.png)
例如我这里使用的dll有4个依赖:
![在这里插入图片描述](https://img-blog.csdnimg.cn/52a3422c8e144f59bfe3d9be12125e58.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/15833bc09d44446eb10deeee6105f071.png)
然后在 C:\Windows\System32 下,依次找到所依赖的库文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/9ec6b64e61e242cf923eefa2033d32fd.png)
复制到exe执行目录,即可正常运行。
![在这里插入图片描述](https://img-blog.csdnimg.cn/b522a084dd5c490ca63e670a3868674e.png)
为了优化解决办法,可以把所有依赖的dll都打包进exe中,方便在目标PC运行,
可参考: Python通过PyInstaller 将DLL文件直接打包进exe,
博主热门文章推荐:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190712110633686.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hvd2llWHVl,size_16,color_FFFFFF,t_70)
一篇读懂系列:
- 一篇读懂无线充电技术(附方案选型及原理分析)
- 一篇读懂:Android/iOS手机如何通过音频接口(耳机孔)与外设通信
- 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)
LoRa Mesh系列:
- LoRa学习:LoRa关键参数(扩频因子,编码率,带宽)的设定及解释
- LoRa学习:信道占用检测原理(CAD)
- LoRa/FSK 无线频谱波形分析(频谱分析仪测试LoRa/FSK带宽、功率、频率误差等)
网络安全系列:
- ATECC508A芯片开发笔记(一):初识加密芯片
- SHA/HMAC/AES-CBC/CTR 算法执行效率及RAM消耗 测试结果
- 常见加密/签名/哈希算法性能比较 (多平台 AES/DES, DH, ECDSA, RSA等)
- AES加解密效率测试(纯软件AES128/256)–以嵌入式Cortex-M0与M3 平台为例
嵌入式开发系列:
- 嵌入式学习中较好的练手项目和课题整理(附代码资料、学习视频和嵌入式学习规划)
- IAR调试使用技巧汇总:数据断点、CallStack、设置堆栈、查看栈使用和栈深度、Memory、Set Next Statement等
- Linux内核编译配置(Menuconfig)、制作文件系统 详细步骤
- Android底层调用C代码(JNI实现)
- 树莓派到手第一步:上电启动、安装中文字体、虚拟键盘、开启SSH等
- Android/Linux设备有线&无线 双网共存(同时上内、外网)
AI / 机器学习系列:
- AI: 机器学习必须懂的几个术语:Lable、Feature、Model…
- AI:卷积神经网络CNN 解决过拟合的方法 (Overcome Overfitting)
- AI: 什么是机器学习的数据清洗(Data Cleaning)
- AI: 机器学习的模型是如何训练的?(在试错中学习)
- 数据可视化:TensorboardX安装及使用(安装测试+实例演示)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)