Shared Libraries Setup

linux 動態裝載動態庫 ldd,ldconfig,ld.so.conf, ld.so.cache

前面我們介紹過,GCC編譯C++程序的那些步驟,其中包括編譯的時候include的搜索目錄,鏈接的時候庫的搜索目錄(這裡的庫包含兩種庫)。還有一個時候,需要搜索路徑,那就是裝載動態庫的時候,這個時候與GCC無關了。而是與linux系統自身有關係。

動態轉載動態庫,是為基於動態庫編譯鏈接而來的可執行程序設定的一個程序執行過程中需要的功能,對於那些只基於靜態庫的可執行程序來說,這個功能沒有什麼用。

1)執行這個動作的linux程序:  /usr/bin/ld
2)這個程序參考的文件為:/etc/ld.so.conf,該文件保存著ld應該搜索的so文件路徑。通常ld.so.conf.d
這個文件夾下也保存著分文件,以供合成ld.so.conf
3)該程序實際參考的文件為:/etc/ld.so.cache.這個文件會其實基本上就是對/etc/ld.so.cache 做了稍微的處理利於/usr/bin/ld程序的參考。
4)將/etc/ld.so.conf 更新到/etc/ld.so.cache.的命令: ldconfig. 使用 ldconfig -p|less可以逐步查看從/usr/bin/ld 眼裡的/etc/ld.so.cache的內容(路徑)。
5)所以往/etc/ld.so.conf內做指定的路徑,如/usr/lib等加入你需要程序搜索的動態庫.so文件,
不需要執行ldconfig更新。因為/etc/ld.so.cache中保存的就是目錄,而不是具體的so文件。
6)向/etc/ld.so.conf添加路徑。則需要調用ldconfig來更新/usr/bin/ld的搜索路徑。

運行時動態庫的搜索路徑:

動態庫的搜索路徑搜索的先後順序是:
①編譯目標代碼時指定的動態庫搜索路徑(這是通過gcc 的參數"-Wl,-rpath,"指定。當指定多個動態庫搜索路徑時,路徑之間用冒號":"分隔)
②環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑(當通過該環境變量指定多個動態庫搜索路徑時,路徑之間用冒號":"分隔)
③配置文件/etc/ld.so.conf中指定的動態庫搜索路徑;
④默認的動態庫搜索路徑/lib;
⑤默認的動態庫搜索路徑/usr/lib。

也就是說,雖然linux以裝載動態庫時搜索的路徑以/etc/ld.so.conf為主,但是,仍然有其它的方式,來構建這種裝載路徑的靈活性。仍然是遵守那種先「專」後「寬」的模式去縮短可能的搜索時間。 第一個,就是在編譯連接該程序的時候,就指定將來需要動態庫的時候搜索的位置。注意這個與當時的鏈接路徑雖然有很大的關係,但是他們的概念是不同的。 第二個,也就是在使用/etc/ld.so.conf之前,還有一個路徑設置方法就是環境變量LD_LIBRARY_PATH. 這個東西可以使用: export LD_LIBRARY_PATH=」/usr/lib/old:/opt/lib 來創建修改這個變量。 第三個,才是/etc/ld.so.conf 最後。則是系統默認路徑。

linux 環境變量設置方法總結(PATH/LD_LIBRARY_PATH)

PATH和LD_LIBRARY_PATH本質都是變量,所謂變量的意思就是由別人賦值產生的,直覺往往會讓我們添加和減少這個變量本身的某些路徑,實際上這是不正確的。正確的做法是我們要去修改賦予這個變量數值的那些配置文件,加一條路徑或者減一條。說到底變量只關乎顯示,不關乎其用於顯示的內容。

PATH: 可執行程序的查找路徑 查看當前環境變量: echo $PATH

設置: 方法一: export PATH=PATH:/XXX 但是登出後就失效 方法二:修改~/.bashrc或~/.bash_profile或系統級別的/etc/profile

1. 在其中添加例如export PATH=/opt/ActivePython-2.7/bin:$PATH
2. source .bashrc  (Source命令也稱為「點命令」,也就是一個點符號(.)。source命令通常用於

重新執行剛修改的初始化文件,使之立即生效,而不必註銷並重新登錄)

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,此文件保存已排好序的動態鏈接庫名字列表.)

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

书籍推荐