2012年5月23日 星期三

「cannot open shared object file」的解決方案

有時候執行一些指令,會碰到下面這樣的訊息:

error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory

在這個例子中,我們的程式找不到 libiconv.so.2 這個 dynamic library。那麼應該怎麼解決呢?

首先必須找到系統中的 libiconv.so.2,下面四條指令選一條作就好:

$ locate libiconv.so.2
$ whereis libiconv.so.2
$ find /usr /lib -name libiconv.so.2
$ find / -name libiconv.so.2 2>/dev/null

這時候就可以找出函式庫位置,例如:

/usr/local/lib/libiconv.so

萬一沒有找出來的話,就要自行安裝了。這篇文章有教該如何安裝 libiconv,如果是其他函式庫的話可以自行變通。

找到位置之後,應該怎麼做呢?如果我們有 root 權限的話,可以把函式庫所在路徑寫入 /etc/ld.so.conf,再重新產生 ld 的 cache 即可,如下:

# echo "/usr/local/lib" >> /etc/ld.so.conf # 注意! 要用 >> 而非 >!
# ldconfig

在某些系統中,/etc/ld.so.conf 可能會預設加上 include /etc/ld.so.conf.d/*.conf 這樣的敘述,那們我們也可以把路徑放在那個目錄下:

# echo "/usr/local/lib" >> /etc/ld.so.conf.d/usr_local_lib.conf
# ldconfig

這樣一來就可以讓程式順利搜尋到需要的 library 囉!

BUT!! 玩 Linux 最重要的就是這個 BUT!!

如果我們沒有 root 權限的話該怎麼辦呢?這時候只好很可憐的自己搞定了...如果需要自行編譯 library 的話,可以照著類似的步驟做,但是 prefix (也就是安裝位置) 要設定在自己的家目錄下,例如:

$ ./configure --prefix=$HOME/libiconv

但這邊假設系統中已經有 /usr/local/lib/libiconv.so.2 這個檔案,進行以下步驟:

$ echo "export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH" >> ~/.bashrc

原理很簡單,就是透過設定 LD_LIBRARY_PATH 來讓程式找得到需要的 library 檔案。修改後需要重新登入才會生效喔!

但是...基本上還是建議不要用後面這個方法啦,找你的系統管理員協助設定 /etc/ld.so.conf 才是好主意。這裡有篇文章:Why LD_LIBRARY_PATH is bad,專門在討論為什麼不要隨意使用 LD_LIBRARY_PATH

沒有留言:

張貼留言