Python使用CDLL加载dll文件出现WinError193及函数未找到错误求助
问题原因解答
1. 初始OSError报错原因
- 报错核心原因为Python进程与dll文件的架构不匹配:你当前使用的Python 3.8为64位版本,最初编译生成的my_functions.dll为32位版本,64位进程无法直接加载32位动态库,因此触发WinError 193报错。你后续切换到x64架构的VS编译工具链生成64位dll,已经解决了该问题。
2. 后续AttributeError报错原因
- 该问题由Windows平台动态库的符号导出规则导致:你参考的教程针对Linux平台,Linux环境下编译生成的.so文件默认会导出所有全局函数,无需额外声明;但Windows环境下编译生成的.dll文件默认不会导出任何函数符号,除非你显式声明要导出对应函数。你当前的C代码没有添加导出声明,因此编译出的dll中不存在对外可见的
square函数符号,ctypes自然无法找到该函数。
解决方案
最简单的处理方式是修改C代码,给需要导出的函数添加__declspec(dllexport)声明,修改后的代码如下:
//Filename: my_functions.c #include <stdio.h> __declspec(dllexport) int square(int i){ return i * i; }
修改后重新用原cl命令编译生成dll即可正常调用。
额外优化建议
调用dll函数前建议显式指定函数的参数类型和返回值类型,避免ctypes默认类型转换引发异常:
from ctypes import * my_functions = CDLL("./my_functions.dll") # 显式声明参数和返回值类型 my_functions.square.argtypes = [c_int] my_functions.square.restype = c_int print(type(my_functions)) print(my_functions.square(10)) print("Done")
内容的提问来源于stack exchange,提问作者Ogiad
相关产品推荐
相关产品推荐

