2011-11-10 16 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

ここには2つのオプションがあります:クリーン1(新しい命名方式に対して再コンパイル)とダーティー(古いライブラリのリンク表現を作成)です。

Ubuntuのメンテナー(もしかしたら上流)は、pythonバージョンをboost_pythonライブラリのバージョンに含めることを賢明に考えています。あなたは、libboost_pythonの正しいpythonバージョンとリンクしている必要があります。その名前は "libboost_python-py27.so.1.46.1"で確認できます。あなたのdevelマシン上でPython 2.6にリンクしていて、プログラムがクラッシュするまでそれを実現することはできませんでした。 Ubuntu 11.10に同梱されているlibboost-python1.46-devパッケージの新しいバージョンとプログラムを再リンクする必要があります。 develマシンを新しい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ファイルのバージョン管理されていない名前は、コンパイルの段階でリンカ用であり、インストールされているブーストのヘッダーと同じバージョンにリンクされています。コンパイル後、バージョン管理された.soだけが必要です。

+0

ありがとうthiton。上記のように私は別の質問を持っています。なぜなのかご存知ですか? – yelo