Linux 靜態庫與共享庫

2021-07-03 21:22:01 字數 1712 閱讀 2473

可以把 多個編譯好的目標檔案 打包成為乙個檔案,就是庫檔案。庫檔案有兩種:靜態庫(.a)和共享庫(.so)。

靜態庫和共享庫區別:

靜態庫是 函式的歸檔,在使用時,複製函式的**區到最終的檔案中。

共享庫是 函式的歸檔,在使用時,把函式在共享庫中的位址拿到最終的檔案中。

靜態庫的效率稍高一點,但占用空間非常大,而且不利於修改和維護。

共享庫的效率稍低一點,但占用空間小,而且修改和維護方便。

(1 )寫源** add.c,儲存退出。 

(2 )編譯源程式 add.c,生成目標檔案 add.o 。

gcc -c -static add.c

其中-static 可選,可阻止gcc使用共享庫。

( 3)打包生成 靜態庫檔案(.a)

ar -r 靜態庫檔名 add.o 

靜態庫檔名命名規範: lib庫名.a

比如:ar -r mystaticlib.a add.o

ar指令:

ar [選項]    歸檔檔案名  目標檔案列表

指令ar的常用選項

-d   從歸檔檔案刪除指定目標檔案列表

-q   從指定目標檔案快速附加到歸檔檔案末尾

-r    將指定目標檔案插入文件,如果存在則更新

-t     顯示目標檔案列表

-x   把歸檔檔案展開為目標檔案

1 寫程式test.c,儲存退出。

2 編譯test.c,生成目標檔案test.o。

gcc -c test.c

3 連線庫檔案的方式:

a   直接連線   gcc test.o mystaticlib.a

b   配置環境變數library_path,把庫檔案所在路徑加入,執行 gcc test.o -l myku 即可(庫名)。

c   gcc test.o -l myku -l 庫所在路徑

注:靜態庫檔案在使用時,必須提供 .h檔案。

( 1 )寫源程式 add.c,儲存退出。

(2 )編譯源程式,生成目標檔案(add.o)。

gcc -c -fpic add.c (-fpic省略也行)

(3 )生成共享庫檔案。

gcc -shared add.o -o libmyku.so

共享庫檔案的命名規範: lib庫名.so

使用方式和靜態庫一樣。

注:靜態庫使用函式時複製**段,因此靜態庫在執行時,可執行檔案中包含了所有的**,a.out不再需要靜態庫。

共享庫使用函式時只是留下了函式位址,因此共享庫在執行時,可執行檔案中只有位址而沒有**,a.out需要在共享庫中執行相關函式的**。環境變數ld_library_path可以幫助a.out找到共享庫。

ldd 可執行檔案/庫檔名 - 可以檢視庫檔案的關係

#include

void *dlopen(const char *filename, int flag);

開啟庫檔案,filename是帶路徑的檔名,flag可以為

rtld_lazy: 延遲載入(用的時候再把庫檔案載入到記憶體)

rtld_now: 馬上載入

void *dlsym(void *handle, const char *symbol);

用函式名 從開啟的庫檔案中獲取乙個函式。

int dlclose(void *handle);

關閉庫檔案。

char *dlerror(void); //檢視是否出錯。

Linux 靜態庫與共享庫

一 靜態庫和共享庫 1 靜態庫 a 2 共享庫 so或.sa 二 生成 1 生成共享庫 編譯選項 shared 表示生成共享庫格式 fpic 產生位置無關碼 position independent code 庫名規則 lib 版本號 so 示例 gcc shared fpic test.o o l...

靜態庫與共享庫

編寫使用靜態庫 靜態庫 共享庫 是包含了目標檔案的檔案,這些目標檔案被稱為模板或成員,是可以重用的預編譯 它們以特殊的格式和乙個表或者對映儲存在一起,這個表或者對映將符號名和儲存該符號的成員名字鏈結起來。對映加速了編譯和鏈結過程,靜態庫一般以副檔名.a 代表存檔檔案,archive 命名。為了使用庫...

靜態庫與共享庫

1.靜態庫 所有編譯器都提供一種機制,將所有相關的目標檔案模組兒打包成乙個單獨的檔案,被稱為靜態庫。它可以用作來聯結器的輸入,當聯結器構造乙個輸入的可執行檔案時,它只拷貝靜態庫裡面被應用程式引用的模組兒。在unix 系統中,靜態庫以存檔 一組連線起來的可重定位目標檔案的集合,有乙個頭部來描述成員目標...