加载DLL时Python解释器退出

Python interpreter exits when loading DLL

本文关键字:解释器 退出 Python DLL 加载      更新时间:2023-10-16

我想测试用ctypes包装一个dll。我已经编写了以下测试代码,并使用code::Blocks和Cygwin将其编译为dll。

#define DLL_EXPORT extern "C" __declspec(dllexport)
DLL_EXPORT int sum(int a, int b) {
    return a + b;
}

注意:这是整个代码。

现在,我将TestDll.dll复制到我的Desktop并启动Python解释器。但是当我想加载它时,解释器就退出了!

C:UsersniklasDesktop>python
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win 32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> dll = ctypes.WinDLL('TestDll')
C:UsersniklasDesktop>

但是,加载任何其他库都可以工作,或者如果无法找到库则给出错误。
你能告诉我我哪里做错了吗?

使用Cygwin g++ 3.4.4

检查objdump -p TestDll.dll | grep dll,看看你是否已经链接在"cygwin1.dll"和nm TestDll.dll | grep Dll,看看你是否有一个DllMain。下面的命令应该可以正确地构建DLL:

g++ testdll.c -mno-cygwin -shared -o TestDll.dll

此外,您需要使用CDLL作为cdecl调用约定,而不是WinDLL:

>>> import ctypes
>>> dll = ctypes.CDLL('TestDll')
>>> dll.sum(4, 5)
9
编辑:我从Cygwin存储库编译i686-w64-mingw32-g++.exe(4.5.3),但我过去使用默认的Cygwin gcc没有问题,给定-mno-cygwin选项。

作为一个完整的猜测,我会说cygwin构建的DLL与msvc构建的解释器不兼容,要么是因为ABI问题,要么只是因为您不能使用两个不同的libcs。用MinGW来构建DLL