分類: linux
2012-12-18 22:27
3060人閱讀收藏
舉報 linux下找不到共享庫檔案的典型現象為明明已經安裝某個軟包(如libnet,mysql
),編譯鏈結可以正常進行,但是在執行時出現如「
error while loading shared libraries: libnet.so.1:cannot open shared object file :no such file or directory
」的錯誤提示。
原因是linux
下的共享庫路徑配置不正確。預設的
linux
共享庫搜尋路徑為
/lib
和/usr/lib
兩個目錄(不包含子目錄),若共享庫不在這兩個路徑
(最典型的就是
/usr/local/lib
),不能被自動動態鏈結到
,解決方法有四種:
1,鏈結時使用靜態庫(
.a檔案)。在
g++命令上寫入改
.a檔案的完整路徑。
2,修改
ld_library_path
環境變數。(臨時有效,且有時候沒有效果)
3,將庫檔案複製到可以搜尋到的路徑裡面,這樣比較狠,但是可能導致一些後即問題。
4,新增搜尋路徑,使用
ldconfig
命令(下面詳細介紹)。
新增搜尋路徑方法步驟:
make install
)。2,使用
locate
命令找到該庫的被預設安裝的路徑,使用方法是先用
updatedb
更新一下
locate
命令的索引庫,然後「
locate libnet.so
」查詢就可以了,在這裡我發現,自動編譯安裝的庫檔案被放在了
/usr/local/lib
目錄。3,修改
/etc/ld.so.conf
,新增路徑。在
centos 6.3
下我看到這個檔案實際上是包含了
/etc/ld.so.conf.d/
這個目錄下的所有
.conf
檔案,因此我們可以在這個路徑下面建立乙個新的檔案,其中寫上諸如「
/usr/local/lib
」、「/usr/local/mysql/lib
」的路徑,儲存退出。
4,切記一定要主動執行命令:
ldconfig
,它會更新記錄了系統中有哪些
so檔案的快取檔案(
/etc /ld.so.cache)
原載於另外我發現:
ldconfig幾個需要注意的地方
1. 往/lib和/usr/lib裡面加東西,是不用修改/etc/ld.so.conf的,但是完了之後要調一下ldconfig,不然這個library會找不到
2. 想往上面兩個目錄以外加東西的時候,一定要修改/etc/ld.so.conf,然後再呼叫ldconfig,不然也會找不到
比如安裝了乙個mysql到/usr/local/mysql,mysql有一大堆library在 /usr/local/mysql/lib下面,這時就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,儲存 過後ldconfig一下,新的library才能在程式執行時被找到。
3. 如果想在這兩個目錄以外放lib,但是又不想在/etc/ld.so.conf中加東西(或者是沒有許可權加東西)。那也可以,就是export乙個全域性變 量ld_library_path,然後執行程式的時候就會去這個目錄中找library。一般來講這只是一種臨時的解決方案,在沒有許可權或臨時需要的時候使用。
4. ldconfig做的這些東西都與執行程式時有關,跟編譯時一點關係都沒有。編譯的時候還是該加-l就得加,不要混淆了。
5. 總之,就是不管做了什麼關於library的變動後,最好都ldconfig一下,不然會出現一些意想不到的結果。不會花太多的時間,但是會省很多的事。
Linux共享庫路徑配置詳解
linux共享庫路徑配置詳解 linux下找不到共享庫檔案的典型現象為明明已經安裝某個軟包 如libnet,mysql 編譯連線可以正常進行,但是在執行時出現如 error while loading shared libraries libnet.so.1 cannot open shared o...
Linux動態庫路徑配置
為什麼要關注動態庫路徑配置,是因為工作中遇到動態庫依賴其他動態庫,而其他動態庫又找不到的問題。有一篇部落格寫的特別全 linux 系統上有兩類根本不同的 linux 可執行程式。第一類是靜態鏈結的可執行程式。靜態可執行程式包含執行所需的所有函式 換句話說,它們是 完整的 因為這一原因,靜態可執行程式...
在linux下設定共享庫路徑
移植程式時的經常碰到需要使用一些特定的動態庫,而這些編譯好的動態庫放在我們自己建立的目錄裡,這時可以將這些目錄設定到ld library path中 那麼就需要指定 環境變數 ld library path 假如現在需要在已有的 環境變數 上新增新的 路徑 名,則採用如下方式 ld library ...