靜態庫和動態庫的區別

2021-06-19 05:11:31 字數 2203 閱讀 1161

windows

vc++

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

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

兩者區別: 

一,靜態庫的使用需要: 

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

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

二,動態庫的使用: 

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

三,依賴性: 

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

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

四,區別: 

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

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

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

五: 首先糾正所謂「靜態連線就是把需要的庫函式放進你的exe之中」的說法。在真實世界中,有三個概念: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檔案比較合理,它包含了函式的實現。 

下面再談static   linked   dll   和   dynamic   linked   dll又如何? 

靜態鏈結   (static   linked   dll)從操作上在vc的project|settings...|link   (tab)|general   (category)|object/library   modules   中設定和新增。比如要使用sdk中的propertysheet()   api,   就要在這裡新增   comctl32.lib,然後再呼叫的源程式中#include   ,   使用的地方直接呼叫propertysheet()。當程式.exe啟動時,系統會把對應comctl32.dll載入進來。作為dll的靜態引入庫的.lib不包含函式的實現,只包含用於系統載入的資訊,如對應的dll名稱,函式歧視地只在對應的dll中的便宜等等。相比動態鏈結而言,靜態鏈結是很簡單的。 

動態鏈結是使用loadlibrary()/getprocessaddress()和freelibrary(),詳見下面的例子。   

lpfnshellexecuteex   =   (lpfnshellexecuteex)getprocaddress(hshell32dll, 

api_name(shellexecuteex)); 

if   (!lpfnshellexecuteex)    

... 

fok   =   (*lpfnshellexecuteex)(pshellexecuteinfo); 

... 

end: 

if   (hshell32dll)    

lpfnshellexecuteex   =   null; 

...  } 

有人會想,動態鏈結這樣麻煩,為什麼還要用呢?這裡有乙個技術問題,對這個問題的解決直接導致了動態載入的需求。問題是有些dll只在某個windows版本中存在,或某個api只在某些windows版本中被加入指定的dll。當你使用靜態鏈結的.exe試圖在不支援的windows版本上執行時,系統會彈出系統對話方塊提示某某.dll無法載入或無法定位某某api的訊息,然後就中止.exe的執行。像這樣因為個別功能的實現依賴於某個dll,當這個dll不可用時導致整個.exe無法執行是不明智的。避免這樣的結局只有用動態鏈結。

靜態庫和動態庫的區別

靜態庫在程式編譯時被連線到目標 中,程式執行時不再需要靜態庫 動態庫在編譯時並不被連線到目標 中,而是程式執行時才被載入,執行時仍然需要動態庫存在。靜態庫的命名規範是以 lib為字首,緊接著是靜態庫名,副檔名是.a 先將檔案編譯成 o 檔案然後是編譯成靜態檔案 動態庫檔案在檔名前加 lib字首,擴充...

靜態庫和動態庫的區別

庫的作用 庫是共享程式 的方式,一般分為靜態庫和動態庫。庫實現了某些特定的功能模組化。方便分享和使用!異同點 2.靜態庫和動態庫有什麼特點?不同點 靜態庫 鏈結時完整地拷貝至可執行檔案中,被多次使用就有多份冗餘拷貝。動態庫 鏈結時不複製,程式執行時由系統動態載入到記憶體,供程式呼叫,系統只載入一次,...

靜態庫和共享庫 動態庫 的區別

靜態庫和共享庫 動態庫 的區別 根據鏈結時期不同,分為靜態庫和共享庫,靜態庫是在程式編譯時鏈結的,共享庫是在程式執行時鏈結的。庫是預先編譯好的方法的集合,命名一般為libxx.a 靜態庫 libxx.so 動態庫 庫檔案常存放的地點為 lib或 usr lib,庫對應的標頭檔案一般存放在 usr i...