動態庫和靜態庫

2021-06-23 03:55:57 字數 1388 閱讀 6374

先抄一段 windows下的動態庫和靜態庫區別解釋,其實linux下意義一樣的,不過字尾名有些區別

靜態庫:在編譯的時候載入生成目標檔案,在執行時不用載入庫,在執行時對庫沒有依賴性。 

動態庫:在目標檔案執行時載入,手動載入,且對庫有依賴性。 

兩者區別: 

一,靜態庫的使用需要: 

1 包含乙個對應的標頭檔案告知編譯器lib檔案裡面的具體內容 

2 設定lib檔案允許編譯器去查詢已經編譯好的二進位制** 

二,動態庫的使用: 

程式執行時需要載入動態庫,對動態庫有依賴性,需要手動加入動態庫 

三,依賴性: 

靜態鏈結表示靜態性,在編譯鏈結之後, lib庫中需要的資源已經在可執行程式中了, 也就是靜態存在,沒有依賴性了 

動態,就是實時性,在執行的時候載入需要的資源,那麼必須在執行的時候提供 需要的 動態庫,有依賴性, 執行時候沒有找到庫就不能執行了 

四,區別: 

簡單講,靜態庫就是直接將需要的**連線進可執行程式;動態庫就是在需要呼叫其中的函式時,根據函式對映表找到該函式然後調入堆疊執行。 

做成靜態庫可執行檔案本身比較大,但不必附帶動態庫 

做成動態庫可執行檔案本身比較小,但需要附帶動態庫 

五: 有三個概念:use   static   libary,   static   linked   dll,   dynamic   linked   dll. 

多數人混淆了static   libary   和   static   linked   dll的概念,當然他們有似是而非的「相似之處」,比如都用到.lib,下面具體說明。 

使用靜態庫(use   static   libary)是把.lib和其他.obj一起build在目標檔案中,目標檔案可以是.exe,也可以是.dll或.oxc等。一般情況下,可以根本就沒有「對應的」.dll   檔案,如c   run   time(crt)庫。乙個例子就是,寫乙個main(){},build出來並不是只有幾個位元組,當然有人會說那還有exe檔案頭呢?是,即使加上檔案頭的尺寸,build出的執行檔案仍然「莫名的大」。實際上那多出來的部分就是crt靜態庫。姑且可以把靜態庫.lib理解成外部程式的obj檔案比較合理,它包含了函式的實現。 

linux下具體實現

靜態庫 

假設乙個***.o檔案

ar -rsv  ***.a ***.o  建立乙個***.a 靜態庫

ar -t ***.a   檢視具體的靜態庫包含內容

gcc -o xx xx.c -l./xx,a  xx.c 可以使用xx.a 的函式啦啦

gcc -o xx xx.c -lxx 也可以

動態庫gcc  -fpic   -shared  -o ***.so  ***.o    建立動態庫

gcc -o xx  ***.c ***.so 

動態庫和靜態庫

本文主要解決以下幾個問題 1 為什麼要使用庫?2 庫的分類 3 建立自己的庫 或許大家對自己初學linux時的情形仍記憶尤新吧。如果沒有乙個能較好的解決依賴關係的包管理器,在linux下安裝軟體將是一件及其痛苦的工作。你裝a包時,可能會提示你要先裝b包,當你費盡心力找到b包時,可能又會提示你要先安裝...

動態庫和靜態庫

簡單的說,使用動態庫就是在鏈結的時候,不會將動態庫的 鏈結到可執行檔案中,而是採用symbol的方式。使用靜態庫,生成可執行檔案的時候,會將靜態庫的 鏈結到可執行檔案中。這樣,動態庫體積會很小,並且可以,依賴於更新的動態庫,但是,缺點是不穩定。靜態庫會更加穩定,但是體積會很大。靜態庫 就是多個目標檔...

動態庫和靜態庫

靜態庫和動態庫 二進位制級別的 復用 封裝函式或類,供程式呼叫,是二進位制檔案,最多只能被反編譯成彙編 動態庫 dynamic link library,動態鏈結庫或共享庫 shared object 只是把要鏈結的動態庫的相關資訊 名字,符號表等 嵌入到可執行檔案中去,在執行時呼叫相應的動態庫。動...