所以,我有以下文件:
插件程序
long int addone(long int x){
return x+1;
}
然后通过 GCC 7.2.0 的 Windows 安装将其编译成 DLL(我也尝试使用英特尔 C++ 编译器,在将函数更改为 之后extern "C" long int addone(long int x),但是当我尝试将其加载到 Python 时并没有改变结果):
gcc -c addone.c
gcc -shared -o addone.dll addone.o
然后我尝试加载到 python 3.6.7:
import ctypes
_addone = ctypes.CDLL("addone.dll")
尽管我确实设法获得了 CDLL 对象,但它缺少“addone”函数。我已经尝试使用导入 C DLL的ctypes.WinDLL()和ctypes.windll.LoadLibrary方法,但这些方法都实现了相同的最终结果:我从 ctypes 获得一个对象,该对象不拥有公共方法,也没有任何私有方法(在 Python 对象中,而不是 DLL)似乎与 addone 功能有关。
只是为了仔细检查我的编译器是否按照我的预期运行,我反汇编了生成的 DLL,它看起来像一个典型的 DLL。在内部,该函数甚至没有名称错误:
0000000530ce1030 <add_one>:
530ce1030: 55 push %rbp
530ce1031: 48 89 e5 mov %rsp,%rbp
530ce1034: 48 89 4d 10 mov %rcx,0x10(%rbp)
530ce1038: 48 8b 45 10 mov 0x10(%rbp),%rax
530ce103c: 48 83 c0 01 add $0x1,%rax
530ce1040: 5d pop %rbp
530ce1041: c3 retq
530ce1042: 90 nop
<Everything between these two instructions is just more no-ops>
530ce104f: 90 nop
我已经能够在 Unix 系统上完成这项工作,并且在该平台上将 C DLL 与 Python 连接起来没有任何问题。然而,转移到 Windows,我觉得我错过了一些东西。即使在另一台机器上尝试所有这些,我仍然无法访问我编写的函数。
我觉得我在这里错过了一些东西。我究竟做错了什么?
沧海一幻觉
慕森卡
相关分类