靜態庫,靜態鏈結,動態鏈結 的區別

2021-05-05 05:51:40 字數 1762 閱讀 7196

遺憾地說:除了ender說的(靜態庫在程式執行時就會裝入記憶體,而動態庫在呼叫的時候才裝入!)是正確的外,其他觀點都有偏頗之處甚至是錯誤的。我的感覺是,大家受mfc的影響太深了,而沒有看到事情的本質。  

首先糾正所謂「靜態連線就是把需要的庫函式放進你的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 直到在某個庫中找到了含有所引用函式的物件模組,然後鏈結程式把這個物件模組拷貝到結果可執行檔案 exe 中。鏈結程式維護對該函式的所有引用,使它們指向該程式中現在含有該函式拷貝的地方。二 動態鏈結 鏈結程式也是搜尋乙個或者多個庫檔案 輸入庫...

靜態鏈結與動態鏈結的區別

動態鏈結庫 靜態庫 import庫區別 動態鏈結庫 dynamic linked library windows為應用程式提供了豐富的函式呼叫,這些函式呼叫都包含在動態鏈結庫中。其中有3個最重要的dll,kernel32.dll,它包含用於管理記憶體 程序和執行緒的各個函式 user32.dll,它...

靜態鏈結與動態鏈結的區別

靜態鏈結是指要把呼叫的函式或者過程直接鏈結到可執行檔案中,成為可執行檔案的一部分。換句話說,函式和過程的 就在程式的exe 檔案中,該檔案包含了執行時所需的全部 靜態鏈結的缺點是當多個程式都呼叫相同函式時,記憶體中就會存在這個函式的多個拷貝,這樣就了浪費了記憶體資源。動態鏈結是相對於靜態鏈結而言的,...