加载DLL时Python解释器退出

2 投票
2 回答
517 浏览
提问于 2025-04-17 05:47

我想用 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 这个选项就可以了。

撰写回答