Linux 共用庫:LD_LIBRARY_PATH 與ld.so.conf

來源:互聯網
上載者:User
http://blog.sina.com.cn/s/blog_5623cddb0100e4sq.html
LD_LIBRARY_PATH  Linux環境變數名,該環境變數主要用於指定尋找共用庫(動態連結程式庫)時除了預設路徑之外的其他路徑。(該路徑在預設路徑之前尋找)
  移植程式時的經常碰到需要使用一些特定的動態庫,而這些編譯好的動態庫放在我們自己建立的目錄裡,這時可以將這些目錄設定到LD_LIBRARY_PATH中。
  當執行函數動態連結.so時,如果此檔案不在預設目錄下‘/usr/local/lib’ and ‘/usr/lib’.
  那麼就需要指定環境變數 LD_LIBRARY_PATH
  假如現在需要在已有的環境變數上添加新的路徑名,則採用如下方式:
  LD_LIBRARY_PATH=NEWDIRS:$LD_LIBRARY_PATH.(newdirs是新的路徑串)  Linux 啟動並執行時候,是如何管理共用庫(*.so)的?在 Linux 下面,共用庫的尋找和載入是由 /lib/ld.so 實現的。 ld.so 在標準路經(/lib, /usr/lib) 中尋找應用程式用到的共用庫。

但是,如果需要用到的共用庫在非標準路經,ld.so 怎麼找到它呢?

目前,Linux 通用的做法是將非標準路經加入 /etc/ld.so.conf,然後運行 ldconfig 產生 /etc/ld.so.cache。 ld.so 載入共用庫的時候,會從 ld.so.cache 尋找。

傳統上,Linux 的先輩 Unix 還有一個環境變數:LD_LIBRARY_PATH 來處理非標準路經的共用庫。ld.so 載入共用庫的時候,也會尋找這個變數所設定的路經。

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./libexport LD_LIBRARY_PATH但是,有不少聲音主張要避免使用 LD_LIBRARY_PATH 變數,尤其是作為全域變數。這些聲音是:
* LD_LIBRARY_PATH is not the answer - http://prefetch.net/articles/linkers.badldlibrary.html
* Why LD_LIBRARY_PATH is bad - http://xahlee.org/UnixResource_dir/_/ldpath.html
* LD_LIBRARY_PATH - just say no - http://blogs.sun.com/rie/date/20040710
解決這一問題的另一方法是在編譯的時候通過 -R<path> 選項指定 run-time path。

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一下,不然會出現一些意想不到的結果。不會花太多的時間,但是會省很多的事。

LD_LIBRARY_PATH 這個環境變數是大家最為熟悉的,它告訴loader:在哪些目錄中可以找到共用庫。可以設定多個搜尋目錄,這些目錄之間用冒號分隔開。在linux下,還提供了另外一種方式來完成同樣的功能,你可以把這些目錄加到/etc/ld.so.conf中,然後調用ldconfig。當然,這是系統範圍內全域有效,而環境變數只對當前shell有效。按照慣例,除非你用上述方式指明,loader是不會在目前的目錄下去找共用庫的,正如shell不會在當前目前找可執行檔一樣。  庫搜尋路徑的確定有很多方法,LD_LIBRARY_PATH只是其中一種。如編譯命令列rpath參數.   串連時的LD_RUN_PATH環境變數。/lib,/usr/lib標準目錄。動態連接器緩衝/etc/ld.so.conf.  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.