我正在尝试在Windows 10(x64)中的python中加载库。
用于生成用于测试的库的cpp文件为:
extern "C" int check() {
return(1);
}
然后我使用命令生成dll(在x64本机工具命令提示符中:
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
FYI,cl /LD mylib.cpp
将一步编译并链接DLL。
FYI,CDLL
和WinDLL
在x64上也无关紧要,但分别对应于x86上的__cdecl
和__stdcall
调用约定。 x64只有一种调用约定,因此两者都可以使用。