動態連線庫和靜態連線庫有什麼區別?

2021-06-29 15:44:00 字數 1523 閱讀 2961

靜態庫在程式執行時就會裝入記憶體,而動態庫在呼叫的時候才裝入!

首先糾正所謂「靜態連線就是把需要的庫函式放進你的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無法執行是不明智的。避免這樣的結局只有用動態鏈結。

動態庫和靜態庫

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

動態庫和靜態庫

先抄一段 windows下的動態庫和靜態庫區別解釋,其實linux下意義一樣的,不過字尾名有些區別 靜態庫 在編譯的時候載入生成目標檔案,在執行時不用載入庫,在執行時對庫沒有依賴性。動態庫 在目標檔案執行時載入,手動載入,且對庫有依賴性。兩者區別 一,靜態庫的使用需要 1 包含乙個對應的標頭檔案告知...

動態庫和靜態庫

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