Linux下的靜態庫和動態庫

2021-08-20 15:16:17 字數 1820 閱讀 1538

在我們平時寫**的時候,通常會引用一些庫檔案來幫助我們實現需要的功能,這些庫檔案是別人提前已經寫好的,我們只需要拿出庫檔案的介面來使用就可以了。

這種庫檔案分為兩種,一種是靜態庫,一種是動態庫。

靜態庫可以簡單的看成一組目標檔案集合,即很多目標檔案經過壓縮打包後形成乙個檔案。

在靜態庫的載入過程中,第一步是用編譯器進行編譯,將我們的源程式編譯成乙個臨時彙編檔案,然後用彙編器彙編成臨時目標檔案,接著最關鍵的一步,就是鏈結,這一步會完成對目標檔案的鏈結,我們的靜態庫就是在這一步被載入進去的,鏈結器會對鏈結結果進行一些處理,如我們鏈結的庫檔案還會依賴於別的檔案,這個時候鏈結器就會繼續鏈結,收集所有與程式初始化相關的資訊別去構造初始化結構。

這些步驟綜合起來其實相當複雜,所以會有專業的人員去搞編譯這一部分的內容,我們在一開始的時候不必過分深入的研究這一部分的內容,只需要大致知道它的執行過程。

當然,我們需要知道如何去製作靜態庫:ar -cr libmymath.a file.o file.o,其中ar是gnu的歸檔工具,cr表示(create and replcce),libmymath.a是靜態庫檔名,mymath是靜態庫名,記得一定不要忘記加lib否則可能會執行出錯。

製作完成後就是對靜態庫的使用,只需要-l 庫的路徑 -l庫名就可以使用自己製作的靜態庫了。

庫搜尋路徑:

1.從左到右搜尋-l指定的目錄。

2.由環境變數指定的目錄。(library_path)

3.由系統指定的目錄》* /usr/lib>* /usr/local/lib

聊完靜態庫,我們再說說動態庫。

動態庫(.so):程式在執行的時候才去鏈結動態庫的**,多個程式共享使用的**。 乙個與動態庫鏈結的可執行檔案僅僅包含它用到的函式入口位址的乙個表,而不是外部函式所在的目標檔案的整個機器碼。

在可執行檔案開始執行以前,外部函式的機器碼由作業系統從磁碟上的該動態庫中複製到記憶體中,這個過程稱為動態鏈結。

動態庫可以在多個程式間共享,所以動態庫鏈結使得可執行檔案更小,節省了磁碟空間,作業系統採用虛擬記憶體機制允許物理記憶體中的乙份動態庫被要用到該庫的所有程序共用,節省了記憶體和磁碟空間。這也是為什麼要使用動態庫的一部分原因。另外一部分原因是靜態鏈結對程式的更新,部署和發布也會帶來很多麻煩。比如你的程式需要更新,如果使用靜態庫,那麼就要將新的程式整個重新發布,比如更新了乙個1m的模組,其程式原本大小有20m,那麼現在就要給21m全部重新發布。如果通過網路來更新,那麼就會變得相當不便,因為伺服器可能同時要給成千上萬的使用者做出更新傳輸,再比如atm這樣的24小時工作的機器,使用靜態鏈結就必須要關閉機器,而動態鏈結就可以進行平滑公升級,諸如此類的好處,所以動態鏈結在現在還是非常有用的方式。

聽了這麼多的好處,我們來了解一下動態庫是如何製作的,指令gcc -fpic -shared -o libmath.so file.c file1.c

接下來還必須有一步,指定動態庫的路徑/etc/ld.so.conf.d/name.conf

因為動態庫的動態鏈結的,所以系統必須重新整理過後才能使用,重啟可以進行重新整理,或者使用命令ldconfig重新整理核心快取,立即生效。

使用動態庫:gcc -file.c -l . -lmymath。

通過ldd a.out檢視所依賴的庫檔案路徑。

其原始碼與靜態庫相比基本沒有變化:動態庫原始碼

linux 下靜態庫和動態庫

我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該 靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。本文主要通過舉例來說明在 linux中如何建立...

linux下的靜態庫和動態庫

庫是什麼?在我們實際程式設計中,經常會引入各種庫函式,那麼庫是什麼?從本質上來說是一種可執行 的二進位制格式,可以被載入記憶體中執行。庫分靜態庫和動態庫兩種。靜態庫 linux下靜態庫的名字一般是lib a,為庫的名字。利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目標 中,...

linux下的靜態庫和動態庫

意義 為了避免 的重寫率,我們可以將已經寫好的 形成乙個庫,當我們再次用到的時候可以直接呼叫,而不是重新去寫,即 站在巨人的肩膀上 linux下有兩種庫 一 靜態庫 準備工作 int swap int x,int y include int main 1 將我們需要的函式生成乙個.o 檔案 root...