Linux環境變量名,該環境變量主要用於指定查找共享庫(動態連接庫)時除了默認路徑以外的其餘路徑。(該路徑在默認路徑以前查找)
移植程序時的常常碰到須要使用一些特定的動態庫,而這些編譯好的動態庫放在咱們本身創建的目錄裏,這時能夠將這些目錄設置到LD_LIBRARY_PATH中。
當執行函數動態連接.so時,若是此文件不在缺省目錄下‘/usr/local/lib’ and ‘/usr/lib’.
那麼就須要指定環境變量LD_LIBRARY_PATH
假如如今須要在已有的環境變量上添加新的路徑名,則採用以下方式:
LD_LIBRARY_PATH=NEWDIRS:$LD_LIBRARY_PATH.(newdirs是新的路徑串)html
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 加載共享庫的時候,也會查找這個變量所設置的路經。mysql
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./liblinux
export LD_LIBRARY_PATHsql
可是,有很多聲音主張要避免使用 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不會在當前目前找可執行文件同樣。
shell
庫搜索路徑的肯定有不少方法,LD_LIBRARY_PATH只是其中一種。如編譯命令行rpath參數. 鏈接時的LD_RUN_PATH環境變量。/lib,/usr/lib標準目錄。動態鏈接器緩存/etc/ld.so.conf.
緩存