安裝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. 安裝舊版函式庫
    我在這篇文章找到做法,而且他寫得很簡單易懂:)

    1. 先去Debian Packages抓取我要的套件的deb檔

       $ wget http://debian.nctu.edu.tw/debian/pool/main/g/gcc-3.3/libstdc++5_3.3.6-18_amd64.deb
      
    2. 解壓縮抓下來的檔案

       $ dpkg-deb -x libstdc++5_3.3.6-18_amd64.deb libstdc++5
      
    3. 把其中的函式庫放到/usr/lib中 (小心不要覆蓋到本來的檔案了)

       $ sudo mv libstdc++5/usr/lib/libstdc++.so.5* /usr/lib/
      
    4. 更新linker的cache

       $ sudo ldconfig
      

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

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


Last modified on 2010-06-05