2011-11-10 90 views
2

我的应用链接主机A(OS: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),我安装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] 

好奇的是,对于提振条目不保存所谓的名字,但LIB的全名。

+0

顺便说一句,你应该接受一些你的问题的答案。阻止他们作为未解答的问题出现,并向有意回答的人表示一些礼貌。 – thiton

回答

0

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

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

肮脏的解决办法是更快一点:

[email protected]> 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才是必需的。

+0

谢谢thiton。如上所述,我还有一个关于这个名字的问题。你知道为什么吗? – yelo