(靜態庫相當於是提前寫好的庫並且編譯好(即為.o檔案)等呼叫時與原始檔的.o問價一同鏈結生成乙個完全連線的可執行目標檔案,而動態庫只是預先載入了動態庫中的符號表)
1.靜態庫(.a):
將所有的相關的目標檔案打包成乙個單獨的檔案稱為靜態庫,當聯結器構造乙個輸出的可執行檔案時,只複製靜態庫中被應用程式引用的目標模組
(1)靜態庫的優點:
方便程式移植,因為可執行程式與庫函式再無關係,放在如何環境當中都可以執行
(2)靜態庫的缺點:
①靜態鏈結,檔案會很大,往往實現很小的乙個功能就需要占用很大的空間,②每次庫檔案公升級的話,都要重新編譯原始檔,很不方便
2.動態庫(.so):
(1)動態庫是以兩種不同的方式來共享的:
①在任何給定的檔案系統中,對於乙個庫只有乙個.so檔案,所有引用該庫的可執行目標檔案共享這個.so檔案中的**和資料,而不是像靜態庫那樣被複製和嵌入到引用他們的可執行檔案中。
(2)動態庫執行過程:
部分鏈結的可執行檔案的形式使得它在執行時可以和動態庫鏈結。在部分連線的可執行檔案中是沒有資料和**複製到部分鏈結的可執行檔案中的。鏈結器只是複製了一些重定位和符號表資訊,這些資訊使得執行時可以解析動態庫中**和資料的引用
當載入器載入和執行部分鏈結的可執行檔案時,會看到部分鏈結的可執行檔案中包含乙個.interp節,這一節包含動態鏈結器的路徑名稱,動態鏈結器本身就是乙個共享目標檔案。載入器不會像它通常所做的那樣將控制傳遞給應用而是載入和執行這個動態鏈結器,然後動態鏈結器通過執行下面的重定位完成下面的重定位完成鏈結任務:重定位所有動態庫的文字和資料到不相同的各個記憶體段;重定位 部分鏈結的可執行檔案中 所有對於動態庫所定義的符號的引用。
最後動態庫鏈結器將控制傳遞給應用程式。從這個時候開始,共享庫的位置就固定了,並且在程式執行過程中都不會改變
(3)動態庫優點:
①不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有乙份該共享庫的例項
②動態庫在程式執行是才被載入,也解決了靜態庫對程式的更新、部署和發布頁會帶來麻煩。使用者只需要更新動態庫即可,增量更新。
(4)動態庫缺點:
執行環境不同,動態庫存放的位置不一樣,很可能導致程式執行失敗
靜態庫與動態庫
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 ...