歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux環境變量LD_LIBRARY_PATH

Linux環境變量LD_LIBRARY_PATH

日期:2017/2/28 13:45:11   编辑:Linux教程

LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的兩個環境變量,二者的含義和作用分別如下:

LIBRARY_PATH環境變量用於在程序編譯期間查找動態鏈接庫時指定查找共享庫的路徑,例如,指定gcc編譯需要用到的動態鏈接庫的目錄。設置方法如下(其中,LIBDIR1和LIBDIR2為兩個庫目錄):

export LIBRARY_PATH=LIBDIR1:LIBDIR2:$LIBRARY_PATH

LD_LIBRARY_PATH環境變量用於在程序加載運行期間查找動態鏈接庫時指定除了系統默認路徑之外的其他路徑,注意,LD_LIBRARY_PATH中指定的路徑會在系統默認路徑之前進行查找。設置方法如下(其中,LIBDIR1和LIBDIR2為兩個庫目錄):

export LD_LIBRARY_PATH=LIBDIR1:LIBDIR2:$LD_LIBRARY_PATH

舉個例子,我們開發一個程序,經常會需要使用某個或某些動態鏈接庫,為了保證程序的可移植性,可以先將這些編譯好的動態鏈接庫放在自己指定的目錄下,然後按照上述方式將這些目錄加入到LD_LIBRARY_PATH環境變量中,這樣自己的程序就可以動態鏈接後加載庫文件運行了。

區別與使用:

開發時,設置LIBRARY_PATH,以便gcc能夠找到編譯時需要的動態鏈接庫。

發布時,設置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:./lib

export 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.

LD_LIBRARY_PATH: 動態庫的查找路徑

設置:

方法一: export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX 但是登出後就失效

方法二: 修改~/.bashrc或~/.bash_profile或系統級別的/etc/profile

1. 在其中添加例如export PATH=/opt/ActiveP/lib:$LD_LIBRARY_PATH

2. source .bashrc (Source命令也稱為“點命令”,也就是一個點符號(.)。source命令通常用於重新執行剛修改的初始化文件,使之立即生效,而不必注銷並重新登錄)

方法三:這個沒有修改LD_LIBRARY_PATH但是效果是一樣的實現動態庫的查找,

1. /etc/ld.so.conf下面加一行/usr/local/MySQL/lib

2. 保存過後ldconfig一下(ldconfig 命令的用途,主要是在默認搜尋目錄(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,搜索出可共享的動態鏈接庫(格式如前介紹,lib*.so*),進而創建出動態裝入程序(ld.so)所需的連接和緩存文件.緩存文件默認為/etc/ld.so.cache,此文件保存已排好序的動態鏈接庫名字列表.)

方法三設置稍微麻煩,好處是比較不受用戶的限制。

Copyright © Linux教程網 All Rights Reserved