靜態庫、動態庫學習筆記
庫:是一種可執行**的二進位制形式,可被作業系統載入記憶體執行;是寫好的、現有的、完善的可複製的**。
庫可分為靜態庫(.a或.lib)和動態庫(.so或.dll)。
動靜之分是因為鏈結階段對庫的處理不一樣導致。
程式編譯成可執行檔案的過程:預處理–>編譯–>彙編–>鏈結–>可執行檔案。
靜態庫:在鏈結階段,將彙編生成的目標檔案.o與引用到的庫一起鏈結打包到可執行檔案中,因此對應的鏈結方式是靜態鏈結。
靜態庫:一組很多(.o/.obj)目標檔案的集合,經過壓縮打包形成的乙個檔案。
靜態庫的特點:
1、靜態庫對函式庫的鏈結是放在編譯時期完成的;
2、程式在執行時與函式庫再無瓜葛,移值方便;
3、浪費空間和資源,因為所有相關的目標檔案與牽涉到的函式庫被鏈結合成乙個可執行檔案;
linux下使用靜態庫只需要在編譯的時候指定靜態庫的搜尋路徑(-l《庫檔案所在路徑》),指定靜態庫名(-l《庫名》)(說明:-l表示標頭檔案的路徑,-l表示庫的路徑)。
動態庫:在程式編譯時不會鏈結到目標**中,而是在程式執行時才被載入(共享庫)。
動態庫在記憶體中只存在乙份拷貝,而靜態庫用一次拷貝一次,所以,動態庫較靜態庫很大程度上節約空間資源的浪費。
總結二者的區別:
1、靜態庫在程式編譯時會被鏈結到目標**中,程式執行時不在需要該靜態庫,因此,體積較大;
2、動態庫在程式編譯時並不會被鏈結到目標**中,而在程式執行時才被載入,因此,程式執行時還需要動態庫存在,因此,**體積小;
動態庫
建立乙個原始檔: max.c,**如下:
int max(int n1, int n2, int n3)
編譯生成共享庫:
gcc -fpic -shared -o libmax.so max.c
我們會得到libmax.so
#ifndefmax_h
#definemax_h
int max(int n1, int n2, int n3);
#endif
建立乙個使用max函式的test.c,**如下:
#include
#include 「max.h」
int main(int argc, char *ar**)
gcc test.c -l. -lmax 生成a.out,其中-lmax表示要鏈結libmax.so。
-l.表示搜尋要鏈結的庫檔案時包含當前路徑。
注意,如果同一目錄下同時存在同名的動態庫和靜態庫,比如 libmax.so 和 libmax.a 都在當前路徑下,
則gcc會優先鏈結動態庫。
靜態庫
寫原始檔,生成目標檔案。
第乙個原始檔 my_print.c
#include
void cout(const char * message)
原始檔2: my_math.c
int add(int a, int b)
int subtract(int a, int b)
使用gcc,為這兩個原始檔生成目標檔案:
gcc -c my_print.c my_math.c
我們就得到了 my_print.o 和 my_math.o。
歸檔目標檔案,得到靜態庫。
我們使用 ar 將目標檔案歸檔:
ar crv libmylib.a my_print.o my_math.o
我們就得到了libmylib.a,這就是我們需要的靜態庫。
上述命令中 crv 是 ar的命令選項:
c 如果需要生成新的庫檔案,不要警告
r 代替庫中現有的檔案或者插入新的檔案
v 輸出詳細資訊
靜態庫命名規則:lib + 庫名 +字尾.a
動態庫命名規則:lib + 庫名 +字尾.so
C 學習筆記 動態庫與靜態庫
stdafx.h targetver.h dllmain.cpp libraryexercise.cpp 工程名 stdafx.cpp libraryexercise.cpp 定義 dll 應用程式的匯出函式。include stdafx.h declspec dllexport int add i...
靜態庫動態庫
靜態庫動態庫 靜態庫 是在執行程式之前就已經加入到執行 中,成為執行程式的一部分來執行的,字尾名 a 動態庫 是在執行程式啟動時載入到執行 中,字尾名 so 靜態庫和動態庫區別 動態庫編譯速度慢,執行速度快,但是生成的程式體積較大,占用記憶體,然而動態庫較易公升級,就布局而言,動態庫 不易布局,執行...
靜態庫動態庫
我們使用ls l的時候看到的除了看到檔名,還看到檔案的元資料 擁有的許可權 硬鏈結數 檔案所有者 組 大小 檔案最後修改時間 檔名ls l讀取儲存在磁碟上的檔案資訊,然後顯示出來 其實這個資訊除了通過這種方式來讀取,還有乙個sata命令能夠看到更多的資訊 這裡寫描述 上面的執行結果有幾個資訊需要解釋...