ImageMick (or Memcached ..)
程式 make install 完
執行時出現 library 找不到的情形:
程式 make install 完
執行時出現 library 找不到的情形:
# convert
convert: error while loading shared libraries: libMagickCore.so.2: cannot open shared object file: No such file or directory
# /sbin/ldconfig <-- 跑一下 ldconfig 就行,不必重開機
# memcached
memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory
or (新版 libevent)
memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
解決:
# LD_DEBUG=libs /usr/local/bin/memcached
3799: find library=libevent-1.4.so.2 [0]; searching
3799: search cache=/etc/ld.so.cache
3799: search path=/lib/tls/i686/sse2:/lib/tls/i686:/lib/tls/sse2:/lib/tls:/lib/i686/sse2:/lib/i686:/lib
/sse2:/lib:/usr/lib/tls/i686/sse2:/usr/lib/tls/i686:/usr/lib/tls/sse2:/usr/lib/tls:/usr/lib/i686/sse2:/usr/lib/i68
6:/usr/lib/sse2:/usr/lib (system search path)
3799: trying file=/lib/tls/i686/sse2/libevent-1.4.so.2
3799: trying file=/lib/tls/i686/libevent-1.4.so.2
3799: trying file=/lib/tls/sse2/libevent-1.4.so.2
3799: trying file=/lib/tls/libevent-1.4.so.2
3799: trying file=/lib/i686/sse2/libevent-1.4.so.2
3799: trying file=/lib/i686/libevent-1.4.so.2
3799: trying file=/lib/sse2/libevent-1.4.so.2
3799: trying file=/lib/libevent-1.4.so.2
3799: trying file=/usr/lib/tls/i686/sse2/libevent-1.4.so.2
3799: trying file=/usr/lib/tls/i686/libevent-1.4.so.2
3799: trying file=/usr/lib/tls/sse2/libevent-1.4.so.2
3799: trying file=/usr/lib/tls/libevent-1.4.so.2
3799: trying file=/usr/lib/i686/sse2/libevent-1.4.so.2
3799: trying file=/usr/lib/i686/libevent-1.4.so.2
3799: trying file=/usr/lib/sse2/libevent-1.4.so.2
3799: trying file=/usr/lib/libevent-1.4.so.2
3799:
/usr/local/bin/memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file:
No such file or directory
以上顯示在這些路徑找不到 libevent-1.4.so.2
解決:
libevent 1.4 版
# ln -s /usr/local/lib/libevent-1.4.so.2 /lib/libevent-1.4.so.2
libevent 2.0 版
# ln -s /usr/local/lib/libevent-2.0.so.5 /lib/libevent-2.0.so.5
Note:
以下參考 http://www.study-area.org/cyril/opentools/opentools/x869.html
RUN TIME的時候, 如果編譯時沒有指定-static這個選項,其實可執行檔並不是真的可執行, 它必須在執行(run time)時需要ld.so來做最後的連結動作,建造一個可執行的 image丟到記憶體。如果是靜態連結,編譯時ld會去找libm.a的檔 。如果是動態連結去找libm.so。 所以每次有新改版程式, 或新加動態函式庫如果不在原本的/etc/ld.so.conf搜尋路徑中,都要把路徑 加進來,然後用
ldconfig -v |
一些重要的程式
ld :Link Editor 連結各obj寫進一個可執行檔(executable)。 ldd :秀出一個執行檔用了那些動態函式庫。 ld.so :Dynamic Linker, 動態連結的話,是由ld.so完成執行時期symbol的 :參照與連結。 ld-linux.so :ELF檔的動態連結,跟ld.so一樣。只是ld.so是給a.out format的。 :新的glicb2的ld-linux.so.2已經跟ld.so.2結合成單一程式了。 ldconfig :根據/etc/ld.so.conf內的目錄,做出動態連結所需的cache檔。 |
-
LD_LIBRARY_PATH 或LD_AOUT_LIBRARY_PATH環境變數所指的路逕
-
ldconfig所建立的cache
-
/lib /usr/lib內的檔
ldconfig會根據/etc/ld.so.conf這個檔的設定,加上內定的兩個目錄 /lib /usr/lib來設定ld.so要用到所需要的連結 以及連結的cache到/etc/ld.so.cache。 所以如果換了新的函式庫,新的kernel,內部的標頭檔可能會有變化, 都要跟著改變讓gcc正確的找到,喔不,應該是cpp, ld, ld.so能正確的找到。 不然編出來的執行檔可能是錯誤的,執行時還可能segmentation fault。