2012年6月20日 星期三

加入指定的 share library path

方法一:
    執行指令時,有時會缺少libary (dynamic libary)Linux 運行的時候,是如何管理share libary(通當是*.so,如果是*.so.3.1,那3.1為版本)的呢?
    share libary 由 /lib/ld.so 來 search & load,ld.so 在標準路徑 (/lib, /usr/lib) 中尋找應用程序的library。但是,如果需要用到其它的 share library 在非標準路徑,那 ld.so 怎麼找到它?
    目前, Linux 通用的做法是將非標準路徑加入 /etc/ld.so.conf 或加個檔案在 /etc/ld.so.conf.d/*.conf (內容必需是path) 然後再執行 ldconfig 生成 /etc/ld.so.cache。ld.so 讀取libary的时候,會從 ld.so.cache 查找。
可以再配合 ldd 查看,如下。 ( ldconfig -p 可以列出所有的share library的資訊 )

方法二:
還可以用
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/lib
export LD_LIBRARY_PATH
echo $LD_LIBRARY_PATH

ldd 參數:
-d | 重新定位並回報遺失的物件檔
-r | 重新定位並回報遺失的物件資料與函數
-v | 顯示完整執行過程

#ldd /bin/ls
linux-gate.so.1 =>  (0xb76ee000)
libselinux.so.1 => /lib/libselinux.so.1 (0xb76c6000)
librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb76bd000)
libacl.so.1 => /lib/libacl.so.1 (0xb76b5000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb756e000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb756a000)
/lib/ld-linux.so.2 (0xb76ef000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7551000)
libattr.so.1 => /lib/libattr.so.1 (0xb754c000)


不過…麻煩的是,怎麼知道指令是需要哪個位置的 libary 冏
#ldd device/intel/PRIVATE/xfstk-stitcher/bin/xfstk-stitcher
linux-gate.so.1 =>  (0xf777a000)
libQtGui.so.4 => not found
libQtCore.so.4 => not found
libpthread.so.0 => /lib32/libpthread.so.0 (0xf6a4b000)
libstdc++.so.6 => /usr/lib32/libstdc++.so.6 (0xf6956000)
libm.so.6 => /lib32/libm.so.6 (0xf6930000)
像上面找不到libQtGui、libQtCore,這兩個lib在 /usr/lib 下是有的,但指令會跟你說它就是找不到,寫信問人後才知道是要放在 /usr/lib32 下
(後來我ln後,還是不行、用 LD_LIBRARY_PATH 也是不行…後來是又多裝了些套件後才行的 冏, libqtcore4:i386 和 libqtgui4:i386)


#ldd device/intel/PRIVATE/xfstk-stitcher/bin/xfstk-stitcher
linux-gate.so.1 =>  (0xf777a000)
libQtGui.so.4 => /usr/lib32/libQtGui.so.4 (0xf6ce3000)
libQtCore.so.4 => /usr/lib32/libQtCore.so.4 (0xf6a65000)
libpthread.so.0 => /lib32/libpthread.so.0 (0xf6a4b000)
libstdc++.so.6 => /usr/lib32/libstdc++.so.6 (0xf6956000)
libm.so.6 => /lib32/libm.so.6 (0xf6930000)

ref:
  1. Here
  2. 轻扫蛾黛 浓点绛
  3. 心的距離

沒有留言:

張貼留言