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