【问题标题】:importing dll with dependencies using ctypes使用 ctypes 导入具有依赖项的 dll
【发布时间】:2020-12-20 23:30:00
【问题描述】:

我编译的共享库很少,并且依赖项如下 liba.so 不依赖任何东西,libb.so 依赖于 liba.so,libc.so 依赖于 liba.so,libd.so 依赖于 liba.so、libb.so、libc.so

我在图书馆 b-d 上运行 ldd 并得到了这个:

libb.so:

...some system/installed libs...
liba.so => ./ext/lib/liba.so
...some more system/installed libs...

libc.so:

...some system/installed libs...
liba.so => ./ext/lib/liba.so
...some more system/installed libs...

libd.so:

...some system/installed libs...
libc.so => ./ext/lib/libc.so
libb.so => ./ext/lib/libb.so
liba.so => ./ext/lib/liba.so
...some more system/installed libs...

现在,当我尝试在 python 中导入 libd 时,我收到类似的错误

OSError: ./lib/libd.so: undefined symbol: function_from_libb

我已经阅读了此类问题的其他一些答案,他们建议使用 ctypes.RTLD_GLOBAL 或确保正确设置 LD_LIBRARY_PATH env var,但这些都没有产生任何影响。当我尝试使用 CDLL 导入 liba、libb、libc 时,它工作得很好,那么导致这种情况的 libd 有什么不同?

【问题讨论】:

标签: ctypes


【解决方案1】:

我最终自己解决了这个问题,所以这是我发现的:

libb.so 是一个 C 编译库,因此当 libd.so 编译为 C++ 时,它试图公开它从 libb.so 使用的函数之一,但是 libb.so 没有使用 extern "C" 编译(我没有由于我将其编译为 C,因此不考虑这样做)因此 C++ 尝试公开 C 函数的名称损坏符号,并且当 CDLL 加载 libd.so 时找不到该符号,因为它不作为 c++ 函数存在.

解决方案是在我的 c 代码的头文件中使用它

#ifdef __cplusplus
extern "C" {
#endif
...my c code definitions...
#ifdef __cplusplus
}
#endif

【讨论】:

    猜你喜欢
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多