天天看點

Linux下動态連結庫和靜态連結庫(含課本原圖)

1. 靜态連結庫和動态連結庫

靜态連結庫就是一個多個彙編檔案(obj檔案)的集合,在Linux中通常命名為libxxx.a。對于靜态連結庫函數的連接配接是在編譯階段,直接将obj檔案的一份拷貝代碼連接配接到目标檔案。

動态連結庫也是一個或多個彙編檔案的集合,在Linux中通常命名為libxxx.so。對于動态連結庫函數的連結是在運作階段,各個目标程式之間共享同一份庫檔案。在編譯階段僅僅加載了函數符号。

優缺點:

1. 靜态庫的優點

在編譯階段就完成連接配接,不需要單獨庫檔案。(簡單、直接、粗暴)。

2. 靜态連結庫的缺點

1) 由于每個目标程式都需要拷貝一份連接配接代碼,是以會加重記憶體的負載。

2) 即使目标程式在運作過程中調用不到連結庫的函數(比如分支程式),靜态庫也需要加載。

3. 動态庫的優點:

1) 代碼共享,當多個程式運作同一個動态庫的時候,其實他們是共享的同一份代碼。減少了記憶體的使用量。

2)按需加載,隻有當運作過程中需要使用動态庫的函數,才會去加載動态庫。減少了不必要的記憶體消耗。

4. 動态庫的缺點:

1) 由于是在運作階段,才進行加載,所有會降低目标代碼的執行速度。

需要注意一點:

由于代碼共享,是以動态庫在編譯的時候,内部需要使用相對位址。

Linux下動态連結庫和靜态連結庫(含課本原圖)

2. 靜态庫的建立和使用

兩步走,step1 生成編譯後的檔案,利用ar指令進行打包

gcc -c test.c

ar cr ar cr libtest.a test1.o

3. 動态庫的建立

動态庫在建立的時候必須注意一點

gcc -fPIC -c test.c

gcc -shared libtest.so test.o

使用方法一

gcc -o main main.c 庫檔案全路徑

使用方法二

gcc -o main -Lpath -Ixxx -lxxx

-L:後面直接跟路徑名

-I:頭檔案的路徑

-l:xxx會尋找libxxx.so檔案

Linux下動态連結庫和靜态連結庫(含課本原圖)
Linux下動态連結庫和靜态連結庫(含課本原圖)
Linux下動态連結庫和靜态連結庫(含課本原圖)
Linux下動态連結庫和靜态連結庫(含課本原圖)
Linux下動态連結庫和靜态連結庫(含課本原圖)
Linux下動态連結庫和靜态連結庫(含課本原圖)
Linux下動态連結庫和靜态連結庫(含課本原圖)

繼續閱讀