使用ctypes加载C++编译的XX.dll时报错无法加载mscvr90.dll如何解决
问题解决指南:Python调用C++ XX.dll时提示找不到mscvr90.dll
报错根因
mscvr90.dll是Microsoft Visual C++ 2008 Redistributable运行时库的核心文件,你所持有的XX.dll是基于VS2008编译生成的,运行时强制依赖该版本的运行时组件,系统中未安装对应组件、或者组件版本/架构不匹配时,就会触发找不到该dll的报错。
分步解决方案
方案1(优先推荐):安装对应版本VC运行时
- 确认三个核心架构的一致性:XX.dll的编译架构、Python解释器的架构、VC运行时的架构三者必须完全匹配,例如你使用32位Python、32位XX.dll,哪怕系统是64位,也需要安装x86版本的VC2008运行时;如果是64位Python+64位XX.dll,安装x64版本的VC2008运行时即可。
- 安装完成后重启你的代码编辑器/终端,重新执行加载dll的代码,90%以上的同类型问题都可以通过该方案解决。
方案2(安装运行时无效时使用):手动配置依赖路径
如果安装运行时后仍然报错,可通过手动指定依赖搜索路径解决:
- 先通过Dependency Walker工具打开XX.dll,确认依赖的mscvr90.dll的具体版本和架构,获取对应版本的mscvr90.dll文件并放到指定目录。
- 按Python版本选择对应的路径配置代码,再加载目标dll:
- Python 3.8及以上版本:
import os import ctypes # 替换为mscvr90.dll和XX.dll所在的目录路径 os.add_dll_directory("C:/path/to/your/dll_dir") xx_dll = ctypes.cdll.LoadLibrary("XX.dll")
- Python 3.7及以下版本:
import os import ctypes # 替换为mscvr90.dll和XX.dll所在的目录路径 os.environ['PATH'] = "C:/path/to/your/dll_dir" + os.pathsep + os.environ['PATH'] xx_dll = ctypes.cdll.LoadLibrary("XX.dll")
额外注意事项
- 你所持有的XX.h和XX.lib虽然不需要被ctypes直接加载,但你需要严格对照XX.h中的函数声明,为加载后的dll函数指定参数类型和返回值类型,否则会出现调用参数错乱、程序崩溃的问题,示例如下:
假设XX.h中存在函数声明:
int calculate(int param1, double param2);
对应的ctypes配置代码:
xx_dll.calculate.argtypes = [ctypes.c_int, ctypes.c_double] xx_dll.calculate.restype = ctypes.c_int # 调用示例 result = xx_dll.calculate(10, 3.14)
- 官方文档提到C++项目使用时XX.dll无需放到项目同级目录,仅需要添加到系统环境中,该规则对Python调用同样生效:你可以把XX.dll所在的路径添加到系统环境变量的PATH中,就不需要每次都手动指定路径。
内容的提问来源于stack exchange,提问作者Sylvain
相关产品推荐
相关产品推荐

