Linux 共享对象名称冲突

Linux 共享对象名称冲突,linux,boost,shared-libraries,Linux,Boost,Shared Libraries,我的应用程序链接到主机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.4

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

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

Ubuntu维护者(可能还有上游)认为在boost_python库的版本中包含python版本是明智的。您需要针对libboost_python的正确python版本进行链接,名称“libboost_python-py27.so.1.46.1”确保了这一点。您可能在devel机器上链接了Python2.6,直到程序崩溃才意识到这一点。您应该根据Ubuntu 11.10附带的较新版本的
libboost-python1.46-dev
包重新链接您的程序。要么将你的devel机器完全升级到更新的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。

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

Ubuntu维护者(可能还有上游)认为在boost_python库的版本中包含python版本是明智的。您需要针对libboost_python的正确python版本进行链接,名称“libboost_python-py27.so.1.46.1”确保了这一点。您可能在devel机器上链接了Python2.6,直到程序崩溃才意识到这一点。您应该根据Ubuntu 11.10附带的较新版本的
libboost-python1.46-dev
包重新链接您的程序。要么将你的devel机器完全升级到更新的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。我有另一个关于so名称的问题,正如我上面所说的。你知道为什么吗?谢谢你,蒂顿。我有另一个关于so名称的问题,正如我上面所说的。你知道为什么吗?顺便说一句,你应该接受一些问题的答案。不要把它们当作未回答的问题出现,并对愿意回答的人表示礼貌。顺便说一句,你应该接受一些问题的答案。阻止他们以未回答的问题出现,并对愿意回答的人表现出一定的礼貌。