Python使用ctypes调用C++编译DLL报WinError 1114如何解决?
解决方案
问题根源
你遇到的两个报错本质上都是MinGW编译的DLL的运行时依赖缺失,叠加Python 3.8+的ctypes加载路径限制导致的:
- WinError 1114:TDM-GCC编译的DLL默认依赖TDM专属的运行时库,系统没有对应库文件时DLL初始化失败
- MinGW下的FileNotFoundError:要么是DLL依赖的MinGW运行时库找不到,要么是Python 3.8+默认禁止从相对路径加载DLL,搜索路径匹配失败
具体解决步骤
1. 修改编译命令,静态链接运行时
编译时添加静态链接参数,把依赖的C/C++运行时直接打包进DLL,避免外部依赖:
g++ -o test.dll -shared -fPIC test.cpp -static-libgcc -static-libstdc++ -static
编译完成后可以用dumpbin /dependents test.dll命令检查依赖,正常只会列出Windows系统自带的kernel32.dll等系统库,没有额外的MinGW相关依赖。
2. 修改Python代码,适配路径加载规则
Python 3.8+调整了ctypes的DLL搜索逻辑,相对路径加载容易失败,建议添加搜索目录或者直接用绝对路径加载,同时显式声明函数的参数/返回值类型避免调用异常:
from ctypes import * from random import randint import os # 获取当前脚本所在目录(即DLL存放目录) dll_dir = os.path.dirname(os.path.abspath(__file__)) # 将DLL目录添加到搜索路径(Python3.8+强制要求) os.add_dll_directory(dll_dir) # 加载DLL tester = cdll.LoadLibrary(os.path.join(dll_dir, 'test.dll')) # 显式声明test函数的参数类型和返回值类型,避免ctypes自动推导出错 tester.test.argtypes = [c_int] tester.test.restype = c_int print(tester.test(randint(1, 100)))
内容的提问来源于stack exchange,提问作者GoodCoder666
相关产品推荐
相关产品推荐

