共享对象名称冲突

时间:2011-11-10 06:49:33

标签: linux boost shared-libraries

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

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(OS: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的全名。

1 个答案:

答案 0 :(得分:0)

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

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。