为什么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

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

解决方法

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

解决此问题的最简单方法通常是按照正确的顺序从头开始重建您的产品组件。

,

我能够通过使用以下方法将 /path/to/pyshmringbuffer 添加到我的 python 路径中来解决我的问题:

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

我不能肯定,但正如@PRUNE 指出的那样,我的 python 路径中有一些东西是 python 在看到预期库之前看到的。

巧合的是,我确实在目标机器上的其他地方有一个 libboost_python36.so.1.75.0 版本。这个路径没有出现在我的 PYTHONPATH 或 LD_LIBRARY_PATH 上,所以我不希望它有干扰,但我不能肯定。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...