Python ctypes:不会按预期加载 dll

Python ctypes: doesn't load dll as expected

本文关键字:加载 dll ctypes Python      更新时间:2023-10-16

我正在尝试在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将一步编译和链接 DLL。

仅供参考,CDLLWinDLL在 x64 上无关紧要,但分别对应于 x86 上的__cdecl__stdcall调用约定。 x64 只有一个调用约定,因此任一都可以使用。