加载DLL时,Python解释器退出

时间:2011-11-07 13:47:22

标签: c++ python ctypes

我想用 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复制到我的桌面并启动Python解释器。但是当我想加载它时,解释器就会退出!

C:\Users\niklas\Desktop>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:\Users\niklas\Desktop>

但是,加载任何其他库都有效,或者如果找不到库则会出错 你能告诉我这里我做错了什么吗?

使用Cygwin g ++ 3.4.4

2 个答案:

答案 0 :(得分:1)

作为一个完整的猜测,我会说Cygwin构建的DLL与MSVC构建的解释器不兼容,要么是因为ABI问题,要么是因为你不能使用两个不同的libc。用MinGW构建DLL。

答案 1 :(得分:1)

检查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

编辑:我使用i686-w64-mingw32-g++.exe(4.5.3)从Cygwin存储库编译,但我曾经使用默认的Cygwin gcc而没有问题,给定-mno-cygwin选项。