Linux複習之靜態庫與動態庫的區別

2021-10-07 16:40:35 字數 1564 閱讀 2853

靜態庫在程式編譯時會被鏈結到目標檔案中,程式執行時不需要該庫。缺點是編譯後檔案較大,但是隔離性好。動態庫在編譯時不會被鏈結到目標**中,在程式執行時才被載入,所以程式執行時需要動態庫存在。優點是編譯後檔案較小,多個應用程式可以使用同乙個動態庫,啟動多個程式時,只需要將動態庫載入到記憶體一次。

通過之前的學習可以發現,在生成可執行檔案時,無論使用動態庫還是靜態庫,gcc命令的格式都是相同的,gcc main.c 庫名。這時候生成的a.out檔案並不能區別是靜態庫還是動態庫。所以需要記住,當靜態庫和動態庫同處於乙個目錄/lib下時,使用庫檔案預設鏈結動態庫,如果需要鏈結靜態庫,則需要在編譯時加上選項-static。

這裡有乙個問題,當靜態庫和動態庫更新以後是否要重新生成可執行檔案?

我們通過乙個測試例來進行驗證:

1.建立test.c與m.c檔案

1.靜態庫驗證

靜態庫生成可執行檔案jing.out

下面改變靜態庫的內容,即將m.c檔案內容改為:

再次將m.c生成庫檔案

可以看見,當靜態庫檔案進行更新後,如果重新不生成可執行檔案,結果不會發生改變,並沒有自動更新,當重新編譯可執行檔案jing.out後,結果才會更新。

2.動態庫驗證

通過同樣的流程我們可以發現,動態庫更新後不需要重新編譯可執行檔案就可以實現更新。

總結靜態庫:

靜態庫的名字一般是lib***.a。利用靜態庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合到目標**中,因而優點比較明顯,即編譯後的執行程式不需要外部的函式庫來支援,因為所使用的函式已經被編譯進去了。但是這也是一種缺點,因為如果靜態庫改變了,那麼所有的程式必須重新編譯。

動態庫:

動態庫的名字往往是lib***.so。相對於靜態庫,動態庫並沒有被編譯進目標**中,所有程式執行到相關函式時才呼叫庫中的相應函式,因此動態庫所產生的執行檔案比較小。由於庫沒有被編譯程序式中,而是程式執行時才動態的申請並呼叫,所以程式的執行環境中必須提供相應的庫。動態庫的改變並不能影響所有程式,所以動態庫的公升級比較方便。

Linux靜態庫與動態庫

靜態庫 a 靜態庫的 在編譯過程中已經被載入可執行程式,因此體積較大。編譯程式時候需要庫作依賴,執行時候不需要。方便,不再需要外部函式庫支援 缺點 1 因為靜態庫被鏈結後直接嵌入可執行程式中,相當於每乙個可執行程式裡都有乙個庫的副本,浪費空間 2 一旦庫中有bug,需要重新編譯。建立步驟 1 編寫函...

linux動態庫與靜態庫

現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始。盡量不重複做別人已經做過的事,站在巨人的肩膀上 做事情。根據鏈結時期的不同,庫又有 靜態庫和共享庫 動態庫 二者的不同點在於 被載入的時刻不同,靜態庫的 在編譯過程中已經被載入可執行程式,因此體積較大。共享庫的 是在可執行程式執行時...

Linux 靜態庫與動態(共享)庫

不論是在linux還是windows下程式設計,我們都會用到庫,有自身帶的標準庫,也有我們自己寫的庫,庫就是預先編譯好的的方法的集合。linux中的庫可以分為兩種,靜態庫和動態庫,動態庫也稱為共享庫。在linux中,庫名稱都以lib開始,靜態庫名為 lib a,動態庫名為 lib so。靜態庫和動態...