Python ctypes : doesn't load dll as expected

标签 python c++ c ctypes

我正在尝试在 Windows 10 (x64) 中加载 python 库。

用于生成测试库的cpp文件是:

extern "C" int check() {
  return(1);
}

然后我使用以下命令生成 dll(在 x64 Native Tools 命令提示符中):

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 上并不重要,但对应于 __cdecl__stdcall分别在 x86 上调用约定。 x64 只有一种调用约定,因此两者都可以工作。

关于Python ctypes : doesn't load dll as expected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60225852/

相关文章:

python - 使用Python打开未知的Excel文件名

c++ - 我必须删除 C++ 中的静态数组吗?

c++ - 减少 Linux 中的每个线程内存

C++ 数组中最大的数字。正面及负面

SQL 句柄以及如何正确创建一个?

c - 将数组传递给函数以进行内存分配

python - NotImplementedError : Only tempfile. 临时文件可供使用

python - 如何提取多类分类的随机森林树规则?

python - API 访问失败期间引发的适当异常

c - 如何在 macOS 上使用 `nm` 在 C 程序中显示本地(非外部)符号?