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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:39:03