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。

此外,CDLLWinDLL 在 x64 上无关紧要,但分别对应于 x86 上的 __cdecl__stdcall 调用约定。 x64 只有一个调用约定,所以两者都可以。