为什么python在从备用路径导入共享对象时抛出未定义的符号错误?

2024-10-01 19:15:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Boost::python创建了一个python扩展。为了更容易在不同的目标机器上使用扩展,我将libboost_python36.so.1.75.0库与生成的扩展(pyshmringbuffer.so)放在同一个目录中

我将pyshmringbuffer.so和libboost_python36.so.1.75.0签出到一台机器上,而不是编译在目录:/path/to/pyshmringbuffer中

在将LD_LIBRARY_PATH设置为:/PATH/to/pyshmringbuffer并更改为该目录后,我能够运行python3.6并导入共享对象

当我尝试从备用目录运行python时,问题就出现了。从任何其他目录中,我附加python路径,如下所示:

import sys
sys.path.append("/path/to/pyshmringbuffer")

然后,当我尝试导入pyshmringbuffer时,我得到以下未定义的符号:

ImportError: /path/to/pyshmringbuffer/pyshmringbuffer.so: undefined symbol: _ZNK5boost6python7objects21py_function_impl_base9max_arityEv

我的印象是,所有符号都包含在共享对象中。为什么从何处导入共享库很重要


Tags: topath对象目录机器目标sosys
2条回答

我可以通过在python路径前加/path/to/pyshmringbuffer来解决我的问题,方法是使用:

sys.path.insert(0,"/path/to/pyshmringbuffer")

我不能肯定,但正如@PRUNE所指出的,python在看到预期的库之前已经看到了我的python路径中的某些东西

巧合的是,我确实在目标机器的其他地方有一个libboost_python36.so.1.75.0的构建。这条路径没有出现在我的PYTHONPATH或LD_LIBRARY_路径上,因此我不认为它会干扰,但我不能肯定

错误消息中的符号是内部符号,由其中一个生成工具生成。如果有一个未定义的组件,则表明其中一个组件是使用不兼容的工具版本构建的,或者*.so文件(共享对象)以其他方式过时

解决这一问题的最简单方法通常是从头开始,按照正确的顺序重新构建产品组件

相关问题 更多 >

    热门问题