有時候拿人家的程式來跑,也許是對方只肯給執行檔,或者是不給source的商業軟體,或是其他情況,總之,有時候會遇到自己的系統上缺少該程式所需要的dynamically linked library (也就是系統上的.so檔, shared object),或是自己系統上的函式庫版本太舊或太新,此時的作法有兩種:
-
使用現有新版函式庫假裝成舊版。
此種方法很簡單,只要把新版函式庫建立一個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 所以只好認命的去尋找舊版函式庫了…
-
安裝舊版函式庫
我在這篇文章找到做法,而且他寫得很簡單易懂:)-
先去Debian Packages抓取我要的套件的deb檔
$ wget http://debian.nctu.edu.tw/debian/pool/main/g/gcc-3.3/libstdc++5_3.3.6-18_amd64.deb
-
解壓縮抓下來的檔案
$ dpkg-deb -x libstdc++5_3.3.6-18_amd64.deb libstdc++5
-
把其中的函式庫放到/usr/lib中 (小心不要覆蓋到本來的檔案了)
$ sudo mv libstdc++5/usr/lib/libstdc++.so.5* /usr/lib/
-
更新linker的cache
$ sudo ldconfig
完成了…..
照著這樣做是沒問題啦….只是我心中還有點疑惑,為什麼不直接安裝該deb套件就好?也許有其他什麼原因? -
總而言之,要安裝缺少的library,只要找到相應的.so檔,並放到/usr/lib中(或是/usr/local/lib中),再更新ld的cache即可。
那….如果沒有.so可以抓怎麼辦?那就只好自己找source來編譯了…..那是另外一段故事:D
Last modified on 2010-06-05