1.概論
1.什麼是靜態連線庫,什麼是動態鏈結庫
靜態鏈結庫與動態鏈結庫都是共享**的方式,如果採用靜態鏈結庫,則無論你願不願意,lib 中的指令都全部被直接包含在最終生成的 exe 檔案中了。但是若使用 dll,該 dll 不必被包含在最終 exe 檔案中,exe 檔案執行時可以「動態」地引用和解除安裝這個與 exe 獨立的 dll 檔案。靜態鏈結庫和動態鏈結庫的另外乙個區別在於
靜態鏈結庫中不能再包含其他的動態鏈結庫或者靜態庫
,而在動態鏈結庫中還可以再包含其他的動態或靜態鏈結庫
。靜態鏈結庫與靜態鏈結庫呼叫規則總體比較如下。
對於靜態鏈結庫(比較簡單):
首先,靜態鏈結庫的使用需要庫的開發者提供生成庫的
.h標頭檔案和.lib檔案。
生成庫的.h標頭檔案中的宣告格式如下:
extern "c" 函式返回型別 函式名(參數列);
在呼叫程式的.cpp源**檔案中如下:
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\libtest.lib")
//指定與靜態庫一起鏈結
第二,因為靜態鏈結庫是將全部指令都包含入呼叫程式生成的exe檔案中。因此如果用的是靜態鏈結庫,那麼也就不存在「匯出某個函式提供給使用者使用」的情況,要想用就得全要!要不就都別要!:)
對於動態鏈結庫:
動態鏈結庫的使用需要庫的開發者提供生成的
.lib檔案和.dll檔案
。或者只提供dll檔案。
首先我們必須先注意到dll內的函式分為兩種:
(1)dll
匯出函式(#add 還有匯出類)
,可**用程式呼叫;
(2)dll
內部函式
,只能在dll 程式使用,應用程式無法呼叫它們。
因此呼叫程式若想呼叫dll中的某個函式就要以某種形式或方式指明它到底想呼叫哪乙個函式。
先來闡述一下dll(dynamic linkable library)的概念,你可以簡單的把dll看成一種倉庫,它提供給你一些可以直接拿來用的變數、函式或類。在倉庫的發
展史上經歷了「無庫-靜態鏈結庫-動態鏈結庫」的時代。靜態鏈結庫與動態鏈結庫都是共享**的方式,如果採用靜態鏈結庫,則無論你願不願意,lib中的
指令都被直接包含在最終生成的exe檔案中了。但是若使用dll,該dll不必被包含在最終exe檔案中,exe檔案執行時可以「動態」地引用和解除安裝這個與exe獨立的
dll檔案。靜態鏈結庫和動態鏈結庫的另外乙個區別在於靜態鏈結庫中不能再包含其他的動態鏈結庫或者靜態庫,而在動態鏈結庫中還可以再包含其他的動態或
靜態鏈結庫。
對動態鏈結庫,我們還需建立如下概念:
(1)dll 的編制與具體的程式語言及編譯器無關
只要遵循約定的dll介面規範和呼叫方式,用各種語言編寫的dll都可以相互呼叫。譬如windows提供的系統dll(其中包括了windows的api),在任何開發環
境中都能被呼叫,不在乎其是visual basic、visual c++還是delphi。
(2)動態鏈結庫隨處可見
我們在windows目錄下的system32資料夾中會看到kernel32.dll、user32.dll和gdi32.dll,windows的大多數api都包含在這些dll中。
kernel32.dll中的函
數主要處理記憶體管理和程序排程
;user32.dll中的函式主要控制使用者介面;
gdi32.dll中的函式則負責圖形方面的操作。
一般的程式設計師都用過類似messagebox的函式,其實它就包含在user32.dll這個動態鏈結庫中。由此可見dll對我們來說其實並不陌生。
(3)vc動態鏈結庫的分類
visual c++支援三種dll,它們分別是non-mfc dll(非mfc動態庫)、mfc regular dll(mfc規則dll)、mfc extension dll(mfc擴充套件dll)。
訊息迴圈;mfc擴充套件dll採用mfc的動態鏈結版本建立,它只能被用mfc類庫所編寫的應用程式所呼叫。
注:什麼是lib檔案,lib和dll的關係如何
什麼是lib檔案,lib和dll的關係如何 (1)lib是編譯時需要的,dll是執行時需要的。 如果要完成源**的編譯,有lib就夠了。 如果也使動態連線的程式執行
起來,有dll就夠了。 在開發和除錯階段,當然最好都有。 (2)一般的動態庫程式有lib檔案和dll檔案。lib檔案是必須在編譯期就連線到應用程式中的,而dll
檔案是執行期才會被呼叫的。如果有dll檔案,那麼對應的lib檔案一般是一些索引資訊,具體的實現在dll檔案中。如果只有lib檔案,那麼這個lib檔案是靜態
編譯出來的,索引和實現都在其中。靜態編譯的lib檔案有好處:給使用者安裝時就不需要再掛動態庫了。但也有缺點,就是導致應用程式比較大,而且失去了動
態庫的靈活性,在版本公升級時,同時要發布新的應用程式才行。 (3)在動態庫的情況下,有兩個檔案,乙個是引入庫(.lib)檔案,乙個是dll檔案,引入庫文
件包含被dll匯出的函式的名稱和位置,dll包含實際的函式和資料,應用程式使用lib檔案鏈結到所需要使用的dll檔案,庫中的函式和資料並不複製到可執行文
件中,因此在應用程式的可執行檔案中,存放的不是被呼叫的函式**,而是dll中所要呼叫的函式的記憶體位址,這樣當乙個或多個應用程式執行是再把程式代
碼和被呼叫的函式**鏈結起來,從而節省了記憶體資源。從上面的說明可以看出,dll和.lib檔案必須隨應用程式一起發行,否則應用程式將會產生錯誤。
vc中使用外部的lib,dll,標頭檔案
vc中使用dll需要用到相應的lib檔案和標頭檔案,編譯時需要用到頭檔案,鏈結時用到lib檔案,執行exe時用到dll。
新增頭檔案目錄可以使用tools->options 中的directories下的include files進行新增
新增lib檔案可以使用兩種方法:
1、在tools->options->directories->library files,加入你的lib檔案所在的目錄,然後在project->setting->object->object/library modules中加入你的
lib檔案,如you.lib
2、在project->add to project->files中將你的lib檔案直接加入到工程中去
3.首先要使用該函式的
地方加上該lib的標頭檔案,然後在project->setting->link->加上你的lib檔案的路徑
dll則是在執行exe時,與其放在同一目錄下即可
靜態庫Lib和動態庫Dll
1.概論 1.什麼是靜態連線庫,什麼是動態鏈結庫 靜態鏈結庫與動態鏈結庫都是共享 的方式,如果採用靜態鏈結庫,則無論你願不願意,lib 中的指令都全部被直接包含在最終生成的 exe 檔案中了。但是若使用 dll,該 dll 不必被包含在最終 exe 檔案中,exe 檔案執行時可以 動態 地引用和解除...
C 中動態庫( dll)和靜態庫 lib
最近,做一些程式的封裝,就了解了c 中封裝動態庫 dll 和靜態庫 lib 的方法,以及兩種庫呼叫時異同,現在記錄下,後續有新的理解,會繼續更新 動態庫 dll 動態庫又稱 動態鏈結庫 英文為dll,是dynamic link library 的縮寫形式,dll是乙個包含可由多個程式同時使用的 和資...
動態鏈結庫(dll)與靜態連線庫(lib)
一 前言 dll dynamic 動態鏈結庫,包含多個程式執行的 和資料,程式執行時是需要使用dll lib static 靜態鏈結庫,包含dll中各函式的入口資訊,在程式編譯時用到 動態連線庫可以使設計者隱藏函式的具體實現,便噶增加 的復用性 動態鏈結庫參與的程式中,lib檔案和dll檔案都要用到...