Python ctypes:预期不会加载dll

问题描述 投票:2回答:1

我正在尝试在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时会自动提供。

我应该以不同的方式编译我的库吗?

python c++ c ctypes
1个回答
0
投票

您需要导出您的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,CDLLWinDLL在x64上也无关紧要,但分别对应于x86上的__cdecl__stdcall调用约定。 x64只有一种调用约定,因此两者都可以使用。

© www.soinside.com 2019 - 2024. All rights reserved.