【问题标题】:Python interpreter exits when loading DLL加载 DLL 时 Python 解释器退出
【发布时间】:2011-11-07 13:47:22
【问题描述】:

我想测试用 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

【问题讨论】:

    标签: c++ python ctypes


    【解决方案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
    

    另外,cdecl 调用约定需要使用 CDLL,而不是 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 选项。

    【讨论】:

    • Yippie,使用ctypes.CDLL 修复了在 Ignacios 帖子的评论中遇到的问题。但是即使使用这些命令,使用 Cygwin 仍然失败。不,dll 没有dllmain。为什么必须这样做?没有它使用 MinGw 也可以工作。 :)
    【解决方案2】:

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

    【讨论】:

    • 大声笑,现在这很有趣^^。工作!嗯,一般来说。它不再退出了!但是dll.sum 并没有像预期的那样占用 8 个字节,它不需要任何字节。我需要在没有任何参数的情况下调用它,它会返回2620428。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    相关资源
    最近更新 更多