靜態庫與共享庫

2021-05-24 13:26:39 字數 1024 閱讀 5285

編寫使用靜態庫

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

為了使用庫**,必須在源**檔案中包含適當的標頭檔案並且鏈結到庫。

編寫使用共享庫

共享庫和靜態庫相比有幾個優點:

a、共享庫占用系統資源少。(由於共享庫並沒有被編譯進每個二進位制檔案中,只是在執行時從單個檔案---共享庫鏈結載入,所以它們占用更少的磁碟空間)。

因為核心把該庫所占用的內存在使用蓋庫的所有程式間共享,所以它們使用的系統記憶體更少。

b、共享庫最低限度也比靜態庫快許多,因為它們只需要向記憶體載入一次。

c、共享庫使得**維護的工作大大簡化。當修改了一些錯誤或者新增了一些特性時,使用者只要獲得公升級後的庫並安裝它即可。

而使用靜態鏈結庫的程式每次修改都要重新編譯鏈結到新庫。

建立共享庫的過程

a、編譯目標檔案時使用gcc的-fpic選項,這能產生與位置無關的**並能被載入到任何位址。

b、使用gcc的-shared 和-soname選項

c、使用gcc的-wl選項把引數傳遞給聯結器ld.

d、使用gcc的-l選項顯示的鏈結c庫,以保證可以得到所需的啟動(startup)**,

從而避免程式在使用不同的,可能是不相容版本的c庫的系統上不能啟動執行。

gcc -fpic -g -c liberr.c -o liberr.o

gcc -g -shared -wl,-soname,liberr.so -o liberr.so.1.0.0 liberr.o

-lcln -s liberr.so.1.0.0 liberr.so.1

ln -s liberr.so.1.0.0 liberr.so

gcc -g errtest.c -o errtest -l. -lerr

ld_library_path=$(pwd) ./errtest

靜態庫與共享庫

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

靜態庫與共享庫

庫library 靜態庫在編譯連線時就把庫里的 提取出來放入可執行檔案中,程式執行時不再依賴庫。動態庫在編譯連線時只記錄了要用的名字在哪個庫的檔案中,執行時才庫檔案中找這個檔案中名字 函式或變數 並且訪問它 1 靜態庫 歸檔 lib a 1 生成庫 gcc c 1.c 2.c 只編譯不連線,產生.o...

靜態庫與共享庫

庫是預先編譯好的方法的結合,是由二進位制可執行 組成,可以被載入記憶體中執行。在linux平台,庫通常放在 lib或者 usr lib中。命名 lib a 檔案格式 由眾多的可執行檔案 o 的打包 整合特點 在鏈結階段,會把整個庫中的 整合到程式中,所以最終編譯的可執行程式的大小比較大,但好處是編譯...