Python ctypes:没有按预期加载 dll
Python ctypes: doesn't load dll as expected
我正在尝试在 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
仅供参考,cl /LD mylib.cpp
将一步编译 link 一个 DLL。
此外,CDLL
和 WinDLL
在 x64 上无关紧要,但分别对应于 x86 上的 __cdecl
和 __stdcall
调用约定。 x64 只有一个调用约定,所以两者都可以。
我正在尝试在 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
仅供参考,cl /LD mylib.cpp
将一步编译 link 一个 DLL。
此外,CDLL
和 WinDLL
在 x64 上无关紧要,但分别对应于 x86 上的 __cdecl
和 __stdcall
调用约定。 x64 只有一个调用约定,所以两者都可以。