靜態庫Lib和動態庫Dll

http://blog.csdn.net/weiwangchao_/article/details/6990707

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動態庫不採用MFC類庫結構,其導出函數爲標準的C接口,能被非MFC或MFC編寫的應用程序所調用;MFC規則DLL 包含一個繼承自CWinApp的類,但其無

消息循環;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時,與其放在同一目錄下即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章