linux共享庫路徑配置詳解:
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命令(下面詳細介紹)。
新增搜尋路徑方法步驟:
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的講解很好,大家可以參考。下面是摘自那裡的一段話:
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 2012 12 18 22 27 3060人閱讀收藏 舉報 linux下找不到共享庫檔案的典型現象為明明已經安裝某個軟包 如libnet,mysql 編譯鏈結可以正常進行,但是在執行時出現如 error while loading shared libraries libnet.s...
Linux動態庫路徑配置
為什麼要關注動態庫路徑配置,是因為工作中遇到動態庫依賴其他動態庫,而其他動態庫又找不到的問題。有一篇部落格寫的特別全 linux 系統上有兩類根本不同的 linux 可執行程式。第一類是靜態鏈結的可執行程式。靜態可執行程式包含執行所需的所有函式 換句話說,它們是 完整的 因為這一原因,靜態可執行程式...
在linux下設定共享庫路徑
移植程式時的經常碰到需要使用一些特定的動態庫,而這些編譯好的動態庫放在我們自己建立的目錄裡,這時可以將這些目錄設定到ld library path中 那麼就需要指定 環境變數 ld library path 假如現在需要在已有的 環境變數 上新增新的 路徑 名,則採用如下方式 ld library ...