You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:27:01