在windows和linux下都存在著大量的庫,庫是什麼呢?本質上來說,庫時一種可執行**的二進位制形式,可以被作業系統載入記憶體執行。
我們通常將一些公用函式寫成函式庫,所以庫是別人寫好的,現有的,成熟的,可以服用的**,你可以使用但要必須得遵守許可協議。在我們現實開發過程中,不可能每乙份**都從頭編寫,當我們擁有庫時,我們就可以直接將我們所需要的檔案鏈結到我們的程式中。可以為我們節省大量的時間,提高開發效率。所以,哭的存在意義是不可藐視的。
linux下庫分為兩種,靜態庫和動態庫。
這兩種庫相同點是兩種庫都是由.o檔案生成的,下邊討論一下它們的不同點:
它們兩個還有很明顯的不同點:當同乙個程式分別使用靜態庫,動態庫兩種方式生成兩個可執行檔案時,靜態鏈結所生成的檔案所占用的記憶體要遠遠大於動態鏈結所生成的檔案。(因為靜態鏈結是在編譯時將所有的函式都編譯進了程式。而動態鏈結是在執行是才呼叫庫里相應函式)
問題描述:現假設我們現在需要乙個函式庫,庫裡面有乙個需要可以列印時間的函式,分別以靜態庫,動態庫的方式實現。
準備三個檔案 time.c time.h test.c。
函式庫的標頭檔案
#ifndef __time_h_
#define __time_h_
#include
void
time();
#endif //__time_h_
函式庫的源程式,包含時間列印函式
#include"time.h"
void
time()
測試函式,呼叫了時間列印函式time
#include"time.h"
int main()
上面提到過,無論靜態庫還是動態庫都是由.o檔案生成的,所以將time.c編譯成time.o。
在下面生成靜態庫,動態庫檔案的時候,你可能會出現這樣的錯誤:
/usr/bin/ld: cannot find lc
執行下面命令安裝glibc-static即可:(在root許可權下)
yum install glibc-static
由.o檔案生成靜態庫檔案
設靜態庫名稱為mytime,所以靜態庫的檔名就為libmytime.a
靜態庫的使用
執行下面命令進行靜態鏈結,生成可執行程式。
執行test
./test
現將當前目錄下的靜態庫檔案libmytime.a刪除,再次執行test。我們會發現程式依然執行成功。
這是因為靜態庫鏈結是在程式編譯時就將所有**整合到了程式中,編譯後的可執行程式不再需要外部的函式庫支援。
由.o檔案生成動態庫
設動態庫名為mytime,則動態庫的檔名就為libmytime.so
動態庫的使用
執行下面命令進行動態鏈結,生成可執行程式。
執行test。
我們會發現程式報錯了,錯誤是沒有找到動態庫libmytime.so 。因為進行動態鏈結時,程式並不會在當前目錄中尋找動態庫,而是會在/usr/lib目錄下尋找,所以我們將動態庫libmytime.so移動到/usr/lib下就可以了。(在root許可權下)
mv libmytime.so /usr/lib
再次執行程式,程式執行成功。
比較兩個可執行檔案的大小,我們會發現靜態鏈結生成的可執行檔案要遠遠大於動態鏈結生成的可執行檔案。
Linux中的動態庫與靜態庫
1 靜態庫 靜態函式庫,是函式執行前 編譯 就加到目標程式中去了。優點 1 程式大。2 鏈結時完整地拷貝至可執行檔案中,別多次使用就有多份冗餘拷貝。3 更新,部署,發布較為麻煩 2,動態庫 動態函式庫,是程式執行時 臨時 動態到目標程式中去 優點 1 執行慢 2 發布程式需要提供依賴的動態庫。以上部...
Linux靜態庫與動態庫
靜態庫 a 靜態庫的 在編譯過程中已經被載入可執行程式,因此體積較大。編譯程式時候需要庫作依賴,執行時候不需要。方便,不再需要外部函式庫支援 缺點 1 因為靜態庫被鏈結後直接嵌入可執行程式中,相當於每乙個可執行程式裡都有乙個庫的副本,浪費空間 2 一旦庫中有bug,需要重新編譯。建立步驟 1 編寫函...
linux動態庫與靜態庫
現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始。盡量不重複做別人已經做過的事,站在巨人的肩膀上 做事情。根據鏈結時期的不同,庫又有 靜態庫和共享庫 動態庫 二者的不同點在於 被載入的時刻不同,靜態庫的 在編譯過程中已經被載入可執行程式,因此體積較大。共享庫的 是在可執行程式執行時...