我正在尝试在 Windows 10 (x64) 中加载 python 库。
用于生成测试库的cpp文件是:
extern "C" int check() {
return(1);
}
然后我使用以下命令生成 dll(在 x64 Native Tools 命令提示符中):
cl /c mylib.cpp
link /dll /machine:x64 mylib.obj
生成文件 mylib.dll。 然后在 python 中,初始化显示以下字符串:
Python 3.7.4 (default, Aug 9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
我运行以下命令:
import ctypes
lib=ctypes.CDLL("mylib.dll")
lib.check.restype=(ctypes.c_int,)
最后一个命令失败,表示无法识别 check
。
我也尝试过lib._check
并使用测试 C 文件而不是 cpp,具有相同的结果,并且还尝试使用 ctypes.WinDLL
而不是ctypes.CDLL
.
怎么了? Python 是 x64
以及图书馆mylib.dll
...
如果我这样做:
ctypes.windll.msvcrt.getchar()
功能正常...这里我使用MSVCRT库,当我加载ctypes
时可以自动访问该库。 .
我应该以不同的方式编译我的库吗?
最佳答案
您需要导出您的 API:
extern "C" __declspec(dllexport) int check() {
return 1;
}
另外,lib.check.restype
不应该是一个元组。 .argtypes
采用一个元组:
lib.check.argtypes = ()
lib.check.restype = ctypes.c_int
仅供引用,cl/LD mylib.cpp
将一步编译并链接 DLL。
另外仅供引用,CDLL
和 WinDLL
在 x64 上并不重要,但对应于 __cdecl
和 __stdcall
分别在 x86 上调用约定。 x64 只有一种调用约定,因此两者都可以工作。
关于Python ctypes : doesn't load dll as expected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60225852/