我們經常在做各種二次開發的時候都會使用賣方提供的SDK進行開發,往往賣方並不願理提供給我源程序而是給我一個提供
一系列函數接口說明和一些封裝的動態鏈接庫。
今天我們就要說說靜態鏈接庫和動態鏈接庫,靜態鏈接庫往往以lib后綴結尾,然而動態鏈接庫往往以dll后綴結束。但是我
們不能僅僅以后綴名作為它們二者的區別,比如動態鏈接庫也可能存在lib后綴的文件,然而這種情況下lib文件只是保存一
些函數符號,正則的提供運行代碼的指令部分仍然存在在dll文件中。
其實從本質上來說,動態鏈接庫是我們再運行程序的時候在進行鏈接,然而靜態鏈接庫的代碼指令是直接包含在最終的應用程
序中,所以我們有使用的動態鏈接庫在生成最終的程序里,如果一旦將該動態鏈接庫文件刪除,程序將提示確實xxx.dll文件。
然而使用靜態鏈接庫生成的最終程序里,我們直接刪除靜態鏈接庫文件,程序仍然將正常執行。因為在生成程序的過程中,靜
態鏈接庫中的代碼指令已經完全的嵌入到了應用程序中了。windows提供的大多數服務都是以dll形式提供的。然而靜態鏈接庫雖
然可移植性強,但是會造成程序很龐大,所以往往大多數開發接口都是以動態鏈接庫的形式提供的。
下面將展示一個簡單的動態鏈接庫的范例:
1.打開vc++6.0新建一個動態鏈接庫工程,取名為Dlldemo:
2.創建一個空的DLL工程:
3.我們添加一個頭文件為AddDll.h 一個源文件為AddDll.cpp在本范例中我們將要把下面這個函數封裝為動態鏈接
庫提供給第三方開發:
int Add(int a,int b)
{
return a+b;
}
4.我們在頭文件里添加需要導出的函數的聲明:
1 extern "C" _declspec(dllexport) int Add(int a,int b);
5.然后在源文件里面實現這個導出函數:
1 #include "AddDll.h" 2 3 int Add(int a,int b) 4 { 5 return a+b; 6 }
6.編譯工程,此時便在工程目錄下生成了我們需要的dll文件,如下圖所示:
其中AddDll.h提供動態鏈接庫導出函數的聲明,Dlldemo.dll文件提供了實際導出函數的實現代碼,不過不再是源代碼的
形式。Dlldemo.lib提供了導出函數的一些符號列表。
至此動態鏈接庫便成功生成了。
下面我們用一個例子測試:
1.新建一個測試工程為test,在工程中添加一個test.cpp用於測試
2.將上面的三個文件拷貝到test工程目錄
3.將Dlldemo.lib用以下兩種方式中的一種鏈接到程序:
一.通過工程-設置-鏈接-對象/庫模塊中 添加Dlldemo.lib
二.或者在程序通過#pragma comment(lib,"Dlldemo.lib")
4.在test.cpp包含頭文件AddDll.h,同時用以下測試代碼:
1 #include "AddDll.h" 2 #include <iostream> 3 using namespace std; 4 #pragma comment(lib,"Dlldemo.lib") 5 int main() 6 { 7 int num1,num2; 8 cout<<"Please input the two number:"<<endl; 9 cin>>num1; 10 cin>>num2; 11 int AddResult; 12 AddResult=Add(num1,num2); 13 cout<<"The Add Result is: "<<AddResult<<endl; 14 return 0; 15 }
運行結果:
測試成功咯!!!