error while loading shared libraries 的解決方法

 error while loading shared libraries 的解決方法
 
編譯安裝openmoko的gsmd
#./configure
#make
#make install

然後運行:
#gsmd -s 115200 -p /dev/ttyS0
#libgsmd-tool
報錯:error while loading shared libraries: libgsmd.so.0: cannot open shared object file: No such file or directory

tank@debian:/usr/local/lib$ which  libgsmd-tool
/usr/local/bin/libgsmd-tool
tank@debian:/usr/local/lib$ ldd /usr/local/bin/libgsmd-tool
 linux-gate.so.1 =>  (0xb7f3a000)
 libgsmd.so.0 => /usr/local/lib/libgsmd.so.0 (0xb7f26000)
 libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dcb000)
 /lib/ld-linux.so.2 (0xb7f3b000)
tank@debian:/usr/local/lib$
確實依賴這個庫。
在/usr/local/lib下面找到這個庫:
tank@debian:/usr/local/lib$ ls -l
總計 204
drwxr-sr-x 2 root staff   4096 11-20 09:49 gsmd
-rw-r--r-- 1 root staff 105846 11-20 09:49 libgsmd.a
-rwxr-xr-x 1 root staff    792 11-20 09:49 libgsmd.la
lrwxrwxrwx 1 root staff     16 11-20 09:49 libgsmd.so -> libgsmd.so.0.0.0
lrwxrwxrwx 1 root staff     16 11-20 09:49 libgsmd.so.0 -> libgsmd.so.0.0.0
-rwxr-xr-x 1 root staff  74400 11-20 09:49 libgsmd.so.0.0.0
drwxr-sr-x 2 root staff   4096 11-20 09:49 pkgconfig
drwxrwsr-x 3 root staff   4096 11-14 00:27 python2.5
tank@debian:/usr/local/lib$


一開始以爲是編譯問題,debian服務器用的是gcc4.3,同事編譯使用gcc4.1.但換用gcc4.1也是不行。
想到是鏈接庫的過程中出錯了。

上網搜索:“error while loading shared libraries”
 
解決方法:
   把libgsmd.so.0 所在lib位置加入到/etc/ld.so.conf文件當中
  只要在/etc/ld.so.conf中加入/usr/local/lib這一行,就可以解決此問題,不僅僅是對於libreadline.so.5,大部分的so都存在

這/usr/local/lib這個目錄裏面。
 最後將/etc/ld.so.conf保存後,還要執行ldconfig 纔會使更改生效

 

 

++++++++++++++++++++++++++++++++++++++++

下面轉帖網上的筆記,謝謝原創。
http://hi.baidu.com/wanyinglong/blog/item/1ba5e6242228d0094d088d2b.html

etc/ld.so.conf和ldconfig, PKG_CONFIG_PATH
2009-04-19 22:15

首先說下/etc/ld.so.conf:
這個文件記錄了編譯時使用的動態鏈接庫的路徑。
默認情況下,編譯器只會使用/lib和/usr/lib這兩個目錄下的庫文件
如果你安裝了某些庫,比如在安裝gtk -2.4.13時它會需要glib-2.0 >= 2.4.0,辛苦的安裝好glib後
沒有指定 --prefix=/usr 這樣glib庫就裝到了/usr/local下,而又沒有在/etc/ld.so.conf中添加/usr/local/lib
這個搜索路徑,所以編譯gtk -2.4.13就會出錯了

對於這種情況有兩種方法解決:
一:在編譯glib-2.4.x時,指定安裝到/usr下,這樣庫文件就會放在/usr/lib中,gtk就不會找不到需要的庫文件了
對於安裝庫文件來說,這是個好辦法,這樣也不用設置PKG_CONFIG_PATH了 (稍後說明)

二:將/usr/local/lib加入到/etc/ld.so.conf中,這樣安裝gtk時就會去搜索/usr/local/lib,同樣可以找到需要的庫
將/usr/local/lib加入到/etc/ld.so.conf也是必須的,這樣以後安裝東東到local下,就不會出現這樣的問題了。
將自己可能存放庫文件的路徑都加入到/etc/ld.so.conf中是明智的選擇 ^_^

添加方法也極其簡單,將庫文件的絕對路徑直接寫進去就OK了,一行一個。例如:
include /etc/ld.so.conf.d/*.conf
添加一行:
/usr/local/lib

注:我在ld.so.conf.d 目錄下的可以看到:
tank@debian:/etc/ld.so.conf.d$ vi libc.conf

  1 # libc default configuration
  2 /usr/local/lib
也就是說這個路徑已經有了爲何還要在/etc/ld.so.conf裏添加?是否我只需要運行ldconfig。 

 

再來看看ldconfig是個什麼東東吧 :
它是一個程序,通常它位於/sbin下,是root用戶使用的東東。具體作用及用法可以man ldconfig查到
簡單的說,它的作用就是將/etc/ld.so.conf列出的路徑下的庫文件 緩存到/etc/ld.so.cache 以供使用
因此當安裝完一些庫文件,(例如剛安裝好glib),或者修改ld.so.conf增加新的庫路徑後,需要運行一下/sbin/ldconfig
使所有的庫文件都被緩存到ld.so.cache中,如果沒做,即使庫文件明明就在/usr/lib下的,也是不會被使用的,結果
編譯過程中抱錯,缺少xxx庫,去查看發現明明就在那放着,搞的想大罵computer蠢豬一個。 ^_^
我曾經編譯KDE時就犯過這個錯誤,(它需要每編譯好一個東東,都要運行一遍),所以
切記改動庫文件後一定要運行一下ldconfig,在任何目錄下運行都可以。


再來說說 PKG_CONFIG_PATH這個變量吧:
經常在論壇上看到有人問"爲什麼我已經安裝了glib-2.4.x,但是編譯gtk -2.4.x 還是提示glib版本太低阿?
爲什麼我安裝了glib-2.4.x,還是提示找不到阿?。。。。。。"都是這個變量搞的鬼。

先來看一個編譯過程中出現的錯誤 (編譯gtk -2.4.13):
checking for pkg-config... /usr/bin/pkg-config
checking for glib-2.0 >= 2.4.0 atk >= 1.0.1 pango >= 1.4.0... Package glib-2.0 was not found in the pkg-config

search path.
Perhaps you should add the directory containing `glib-2.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'glib-2.0' found
configure: error: Library requirements (glib-2.0 >= 2.4.0 atk >= 1.0.1 pango >= 1.4.0) not met; consider adjusting

the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find

them.


很明顯,上面這段說明,沒有找到glib-2.4.x,並且提示應該將glib-2.0.pc加入到PKG_CONFIG_PATH下。
究竟這個pkg-config PKG_CONFIG_PATH glib-2.0.pc 是做什麼的呢? let me tell you ^_^

先說說它是哪冒出來的,當安裝了pkgconfig-x.x.x這個包後,就多出了pkg-config,它就是需要PKG_CONFIG_PATH的東東
pkgconfig-x.x.x又是做什麼的? 來看一段說明:
The pkgconfig package contains tools for passing the include path and/or library paths to build tools during the

make file execution.
pkg-config is a function that returns meta information for the specified library.
The default setting for PKG_CONFIG_PATH is /usr/lib/pkgconfig because of the prefix we use to install pkgconfig.

You may add to PKG_CONFIG_PATH by exporting additional paths on your system where pkgconfig files are

installed. Note that PKG_CONFIG_PATH is only needed when compiling packages, not during run-time.
我想看過這段說明後,你已經大概瞭解了它是做什麼的吧。

其實pkg-config就是向configure程序提供系統信息的程序,比如軟件的版本啦,庫的版本啦,庫的路徑啦,等等
這些信息只是在編譯其間使用。你可以 ls /usr/lib/pkgconfig 下,會看到許多的*.pc,用文本編輯器打開
會發現類似下面的信息:
prefix=/usr
exec_prefix=$
libdir=$/lib
includedir=$/include
glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums
Name: GLib
Description: C Utility Library
Version: 2.4.7
Libs: -L$ -lglib-2.0
Cflags: -I$/glib-2.0 -I$/glib-2.0/include
明白了吧,configure就是靠這些信息判斷你的軟件版本是否符合要求。並且得到這些東東所在的位置,要不去哪裏找呀。
不用我說你也知道爲什麼會出現上面那些問題了吧。

解決的辦法很簡單,設定正確的PKG_CONFIG_PATH,假如將glib-2.x.x裝到了/usr/local/下,那麼glib-2.0.pc就會在
/usr/local/lib/pkgconfig下,將這個路徑添加到PKG_CONFIG_PATH下就可以啦。並且確保configure找到的是正確的
glib-2.0.pc,就是將其他的lib/pkgconfig目錄glib-2.0.pc幹掉就是啦。(如果有的話 ^-^)

設定好後可以加入到~/.bashrc中,例如:
PKG_CONFIG_PATH=/opt/kde-3.3.0/lib/pkgconfig:/usr/lib/pkgconfig:/usr/local/pkgconfig:
/usr/X11R6/lib/pkgconfig
[root@NEWLFS ~]#echo $PKG_CONFIG_PATH
/opt/kde-3.3.0/lib/pkgconfig:/usr/lib/pkgconfig:/usr/local/pkgconfig:/usr/X11R6/lib/pkgconfig

從上面可以看出,安裝庫文件時,指定安裝到/usr,是很有好處的,無論是/etc/ld.so.conf還是PKG_CONFIG_PATH
默認都會去搜索/usr/lib的,可以省下許多麻煩,不過從源碼包管理上來說,都裝在/usr下
管理是個問題,不如裝在/usr/local下方便管理
其實只要設置好ld.so.conf,PKG_CONFIG_PATH路徑後,就OK啦 ^_^ 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章