cppyy 无法打开共享库

Posted

技术标签:

【中文标题】cppyy 无法打开共享库【英文标题】:cppyy unable to open shared library 【发布时间】:2020-12-16 09:40:11 【问题描述】:

我正在尝试在 cppyy 中加载 .so,但出现以下错误。

有什么方法可以查看究竟是什么错误,因为 Load() 失败了

load_my_lib.py:57: in <module>
    cppyy.load_library("mylib.so")
.venv/lib/python3.6/site-packages/cppyy/__init__.py:219: in load_library
    sc = gSystem.Load(name)
E   cppyy.gbl.std.exception: int CppyyLegacy::TSystem::Load(const char* module, const char* entry = "", CppyyLegacy::Bool_t system = kFALSE) =>
E       exception: std::exception

【问题讨论】:

【参考方案1】:

看起来库的加载导致std::exception被抛出,而what()的结果为空。

std::exception 的使用而不是它的派生类之一,以及没有从 what() 返回的消息都是一种不常见的用法,我不知道加载库调用中的任何内容本身就可能导致这种情况。因此,我最好的猜测是它在创建位于mylib.so 中的全局或静态变量期间被抛出。

您知道该库中是否有任何静态或全局变量?这些也可能存在于与mylib.so 链接的库中,并在加载时被拉入。

有时获得更好诊断的另一种方法(尽管我在这种情况下对此表示怀疑,因为它不处理 C++ 异常)是使用 ctypes 加载库:

import ctypes
d = ctypes.CDLL("mylib.so", ctypes.RTLD_GLOBAL)

ctypes.CDLL 没有可移植行为,这就是 load_library 存在的原因,但在大多数(并非所有)Linux 发行版中,它是一个完美的选择。)

【讨论】:

感谢您的指点。事实上,这个库正在使用 gtest.so,由于一些设置问题,它无法找到。

以上是关于cppyy 无法打开共享库的主要内容,如果未能解决你的问题,请参考以下文章

加载共享库时出错:libgmock.so:无法打开共享对象文件:没有这样的文件或目录

无法加载动态库“libcupti.so.11.0”; dlerror: libcupti.so.11.0: 无法打开共享对象文件

错误 1126 (HY000): 无法打开共享库 'lib_mysqludf_sys.so' (errno: 193)

加载共享库时出错:libgfortran.so.1:无法打开共享对象文件:没有这样的文件或目录

ctags:加载共享库时出错:libgpm.so.1:无法打开共享对象文件:没有这样的文件或目录

clang:加载共享库时出错:libtinfo.so.5:无法打开共享对象文件:没有这样的文件或目录