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

Why does python throw an undefined symbol error when importing a shared object from an alternate path?

我使用 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 文件(共享对象)以某种其他方式已过时。

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

我可以通过在我的 python 路径前加上 /path/to/pyshmringbuffer 来解决我的问题:

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

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

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