靜態庫與動態庫

2021-10-08 22:41:02 字數 1428 閱讀 9361

什麼是靜態庫?

a.靜態庫的本質就是將多個目標檔案打包成乙個檔案;

b.鏈結靜態庫就是將庫中被呼叫的**複製到呼叫模組中;

c.使用靜態庫的**占用空間較大,庫中**一旦修改必須重新鏈結;

d.使用靜態庫的**在執行時無需依賴庫,且執行效率高;

靜態庫的形式:lib《庫名》.a

靜態庫的構建過程:

1、用gcc生成多個.o檔案

比如:gcc -c a.c -> a.o

gcc -c b.c -> b.o

gcc -c c.c -> c.o

2、使用命令:ar -r libabc.a a.o b.o c.o

將a.o b.o c.o 全部構建到libabc.a裡面

例如:gcc -c main.c -> main.o

gcc -o useabc -labc -l. main.o

什麼是動態庫?

與靜態庫的不同在於,鏈結動態庫並不需要將庫中被呼叫的**複製到呼叫模組中,相反被插入到呼叫模組中的是一段指令序列,待到執行時這些指令會被執行,其效果就是找到動態庫中的被呼叫**並執行之。如果動態庫中的**同時被多個呼叫模組使用,其在記憶體中僅需乙份例項,所有的呼叫模組共享該例項,因此動態庫也叫共享庫。從上述特性可見,使用動態庫的**占用空間較小,庫中**一旦修改,只要尋找該段**的方法不變,無需重新鏈結。使用動態庫的**在執行時需要依賴庫,執行效率略低於靜態庫。

2)動態庫的形式:lib《庫名》.so

3)動態庫的構建

gcc -c -fpic a.c -> a.o

gcc -c -fpic b.c -> b.o > gcc -o libabc.so -shared a.o b.o c.o

gcc -c -fpic c.c -> c.o / ^ _/

| |___________|

位置無關碼

用相對位址實現**跳轉

例如:main.c

gcc -c main.c -> main.o

gcc -o useabc -labc -l. main.o

^ __________/

|_________|

在特定目錄下如果存在庫名相同動態庫和靜態庫(libabc.so和libabc.a),鏈結器一定會優先選擇動態庫(libabc.so),除非使用-static選項,顯式指明鏈結該庫的靜態版本。

5)動態庫的靜態載入

在使用動態庫的可執行程式進入記憶體的同時,該動態庫也必須被裝載到記憶體之中,這個過程就叫動態庫的載入。

a -> 動態庫(3) <- b^|

c共享物件通過引用計數決定其生命週期。

第乙個載入動態庫的程序在其載入過程中會從ld_library_path環境變數所包含的路徑中搜尋所要載入的動態庫檔案,若找到則將其讀入記憶體,同時將引用計數置1。如果找不到所依賴的動態庫檔案,則可執行程式無法啟動。

靜態庫與動態庫

linux下靜態庫 a 的例子 mylib.h 位於include資料夾下 ifndef mylib h define mylib h int add int a,int b endif mylib.cpp 位於lib資料夾中 include mylib.h int add int a,int b ...

靜態庫與動態庫

庫本質上是一種可執行的二進位制 可以被作業系統載入 linux和windows的庫是不相容的 庫可以分為靜態塊和動態庫,二者的不同點在於 被載入的時刻不同。靜態庫 在程式編譯時會被連線到目標 中,程式執行時不再需要改靜態庫,體積較大,一般應用與移植過程中在宿主機上編譯的 靜態庫檔名的命名規範是以li...

靜態庫與動態庫

1.靜態庫 工程在呼叫靜態庫時,複製靜態庫,源 加長,不節省程式空間。字尾名.a 優點 程式設計後不需要再依賴庫 以空間換時間 建立靜態庫 gcc c 原始檔.c ar rcs rcu 靜態庫名 目標檔案1 目標檔案2 rc 靜態庫不存在,就建立該庫檔案 s 更新靜態庫 使用 gcc o file ...