[已解决] Python调用C++ Dll打包运行时报错 PyInstallerImportError: Failed to load dynlib/dll xxx.dll
1. 问题描述
Python通过ctypes调用C++ Dll库,pyinstaller打包成exe后在本机正常运行,但是放到别的PC上单独运行就报错,提示:
PyInstallerImportError: Failed to load dynlib/dll xxxx.dll …
注:我这里是将该dll打包进了exe,但尝试把dll文件直接放入exe目录中 也同样报错
报错信息如下图:
Ctypes调用API没有问题,通过常规ctypes.cdll.LoadLibrary()或ctypes.CDLL():
dll路径方面也正确:
本机测试过程没有任何问题,所以当时就比较奇怪都打包进exe了,还会有这类DLL not found issue
2. 问题原因
最终发现问题 rootcause:
- 是由于该dll本身也有依赖,因此需要将dll在当前开发环境的依赖包,同样放到目标环境exe目录中(或直接打包进exe),才可以正确执行
否则就算将源码迁移到另一台机器,运行时也是报同样的错误,因为该dll依赖在目标机器系统内不支持
3. 问题解决
首先通过 dependencywalker 工具来查找该Dll的依赖包:
下载后,打开depends.exe工具,将相关dll导入,即可找到所有依赖,
例如我这里使用的dll有4个依赖:
然后在 C:\Windows\System32 下,依次找到所依赖的库文件
复制到exe执行目录,即可正常运行。
为了优化解决办法,可以把所有依赖的dll都打包进exe中,方便在目标PC运行,
可参考: Python通过PyInstaller 将DLL文件直接打包进exe,
博主热门文章推荐:
一篇读懂系列:
LoRa Mesh系列:
网络安全系列:
- 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安装及使用(安装测试+实例演示)