我的应用程序链接主机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的全名。
答案 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。