2010年6月5日 星期六

安裝Ubuntu套件庫沒有的library (以libstdc++.so.5為例)

有時候拿人家的程式來跑,也許是對方只肯給執行檔,或者是不給source的商業軟體,或是其他情況,總之,有時候會遇到自己的系統上缺少該程式所需要的dynamically linked library (也就是系統上的.so檔, shared object),或是自己系統上的函式庫版本太舊或太新,此時的作法有兩種:

1. 使用現有新版函式庫假裝成舊版。
此種方法很簡單,只要把新版函式庫建立一個symbolic link就可以了,例如:
[/usr/lib]$ ln -s libstdc++.so.6 libstdc++.so.5
但是很不幸的這種作法是可能出問題的。
例如我今天就遇到了這個問題....

我的系統上裝有libstdc++.so.6,但我要執行的程式連結到的是libstdc++.so.5。所以我用類似以上的方式做了一個假的,結果在執行的時候,跳出訊息顯示,該程式需要CXXABI 1.2(其實我也不太清楚這是啥,只知道ABI是Application Binary Interface),我猜大概是ABI版本太新....沒辦法我動不到....orz 所以只好認命的去尋找舊版函式庫了...

2.安裝舊版函式庫
我在這篇文章找到做法,而且他寫得很簡單易懂:)

a. 先去Debian Packages抓取我要的套件的deb檔
$ wget http://debian.nctu.edu.tw/debian/pool/main/g/gcc-3.3/libstdc++5_3.3.6-18_amd64.deb

b. 解壓縮抓下來的檔案
$ dpkg-deb -x libstdc++5_3.3.6-18_amd64.deb libstdc++5

c. 把其中的函式庫放到/usr/lib中 (小心不要覆蓋到本來的檔案了)
$ sudo mv libstdc++5/usr/lib/libstdc++.so.5* /usr/lib/

d. 更新linker的cache
$ sudo ldconfig

完成了.....
照著這樣做是沒問題啦....只是我心中還有點疑惑,為什麼不直接安裝該deb套件就好?也許有其他什麼原因?

總而言之,要安裝缺少的library,只要找到相應的.so檔,並放到/usr/lib中(或是/usr/local/lib中),再更新ld的cache即可。
那....如果沒有.so可以抓怎麼辦?那就只好自己找source來編譯了.....那是另外一段故事:D

沒有留言:

張貼留言