【问题标题】:the shared object name conflicts共享对象名称冲突
【发布时间】:2011-11-10 06:49:32
【问题描述】:

我的应用程序在主机 A(操作系统:Ubuntu 11.04)中链接 libboost_python(版本:1.46.1)。该库是从源代码构建的,其信息如下:

lrwxrwxrwx 1 henry henry      25 2011-11-10 14:33 libboost_python.so -> libboost_python.so.1.46.1
-rwxr-xr-x 1 henry henry  379867 2011-11-10 14:33 libboost_python.so.1.46.1

当我在主机 B(操作系统:Ubuntu 11.10)上运行我的应用程序时,我安装了与 apt 相同版本的 libboost_python。它的信息有点不同:

lrwxrwxrwx 1 root root     30 2011-06-03 14:54 /usr/lib/libboost_python-py27.so -> libboost_python-py27.so.1.46.1
-rw-r--r-- 1 root root 291224 2011-06-03 14:54 /usr/lib/libboost_python-py27.so.1.46.1
lrwxrwxrwx 1 root root     23 2011-11-09 04:34 /usr/lib/libboost_python.so -> libboost_python-py27.so

libboost_python.so 链接的最终目标是不同的(主机 B 有一个“py27”)。所以当我运行我的应用程序时,会发生错误:

error while loading shared libraries: libboost_python.so.1.46.1: cannot open shared object file: No such file or directory

如何解决这个冲突的名称? 我运行 cmd 'readelf -d myapp' 时的输出:

 0x00000001 (NEEDED)                     Shared library: [libboost_python.so.1.46.1]
 0x00000001 (NEEDED)                     Shared library: [libboost_system.so.1.46.1]
 0x00000001 (NEEDED)                     Shared library: [libpython2.7.so.1.0]
 0x00000001 (NEEDED)                     Shared library: [libjuserclass.so.0]
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so.6]

奇怪的是 boost 的入口并没有保存 so-name 而是 lib 的全名。

【问题讨论】:

  • 顺便说一句,您应该接受一些问题的答案。阻止它们显示为未回答的问题,并对愿意回答的人表现出一些礼貌。

标签: linux boost shared-libraries


【解决方案1】:

这里有两个选项:干净的(根据新的命名方案重新编译)和脏的(创建旧库的链接表示)。

Ubuntu 维护者(可能还有上游)认为将 python 版本包含在 boost_python 库的版本中是明智的。您需要链接到正确的 python 版本的 libboost_python,并且名称“libboost_python-py27.so.1.46.1”可以确保这一点。你可能已经在你的开发机器上链接了 Python 2.6,直到你的程序崩溃才意识到它。您应该将您的程序重新链接到 Ubuntu 11.10 附带的较新版本的 libboost-python1.46-dev 软件包。要么将你的开发机器完全升级到更新的 Ubuntu,要么选择性地退出 libboost-python1.46-dev 的新版本。

脏修复要快一点:

user@B> sudo ln -s libboost_python-py27.so.1.46.1 libboost_python.so.1.46.1

编辑:库的版本化名称出现在链接的可执行文件中是完全正确的。原因很简单:您可以在系统上安装多个版本的 libboost,并链接一些程序,例如反对 1.46.1 和一些反对 1.47.1。 .so 文件的非版本名称用于编译阶段的链接器,并链接到与已安装的 boost 头文件相同的版本。编译后,只需要版本化的 .so 文件。

【讨论】:

  • 感谢 thiton。正如我上面所说的,我还有另一个关于这个名字的问题。你知道为什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 2012-08-17
  • 2017-10-31
相关资源
最近更新 更多