我想用 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
答案 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选项。