Linux下的靜態庫與動態庫

2021-08-28 06:09:04 字數 2586 閱讀 7272

在windows和linux下都存在著大量的庫,庫是什麼呢?本質上來說,庫時一種可執行**的二進位制形式,可以被作業系統載入記憶體執行。

我們通常將一些公用函式寫成函式庫,所以庫是別人寫好的,現有的,成熟的,可以服用的**,你可以使用但要必須得遵守許可協議。在我們現實開發過程中,不可能每乙份**都從頭編寫,當我們擁有庫時,我們就可以直接將我們所需要的檔案鏈結到我們的程式中。可以為我們節省大量的時間,提高開發效率。所以,庫的存在意義是不可藐視的。

linux下庫分為兩種,靜態庫和動態庫。

這兩種庫相同點是兩種庫都是由.o檔案生成的,下邊討論一下它們的不同點:

它們兩個還有很明顯的不同點:當同乙個程式分別使用靜態庫,動態庫兩種方式生成兩個可執行檔案時,靜態鏈結所生成的檔案所占用的記憶體要遠遠大於動態鏈結所生成的檔案。(因為靜態鏈結是在編譯時將所有的函式都編譯進了程式。而動態鏈結是在執行是才呼叫庫里相應函式)

問題描述:現假設我們現在需要乙個函式庫,庫裡面有乙個需要可以列印時間的函式,分別以靜態庫,動態庫的方式實現。 

準備三個檔案 time.c time.h test.c。

函式庫的標頭檔案

#ifndef __time_h_

#define __time_h_

#includevoid 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下的靜態庫與動態庫

準備三個檔案 time.c time.h test.c。函式庫的標頭檔案 ifndef time h define time h includevoid time endif time h 函式庫的源程式,包含時間列印函式 include time.h void time 測試函式,呼叫了時間列印函...

Linux下的靜態庫與動態庫

1 生成.so g test.cpp fpic shared o libtest.so 2 使用.so g l.ltest main.cpp 在使用.so的時候如果找不到.so需要把.so的路徑加到 etc ld.so.conf ldconfig使之生效 ldd 可以檢視main中是否包含了.so。...

linux下建立靜態庫與動態庫

靜態庫 編寫好c原始檔,裡面只有函式的實現。要呼叫的檔案比如是main.c,在檔案裡宣告c原始檔裡的庫函式名。1 首先 gcc c hello.c 生成hello.o 2 ar crs libhello.a hello.o 3 gcc o main main.c l.lhello l後面跟著庫的路徑...