加载DLL时Python解释器退出
我想用 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 个回答
1
我猜测,Cygwin构建的DLL可能和用MSVC构建的解释器不兼容。这可能是因为它们的应用程序二进制接口(ABI)不一致,或者是因为你不能同时使用两种不同的C语言库。建议你用MinGW来构建这个DLL。
2
检查一下这个命令 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 这个选项就可以了。