Windows 动态链接库DLL浅解
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
動態(tài)鏈接庫(DLL),即:Dynamic Link Library。一個包含可由多個程序同時使用的代碼和數(shù)據(jù)的庫,DLL不是可執(zhí)行文件。
設(shè)計(jì)動態(tài)鏈接庫初衷是為了節(jié)約應(yīng)用程序的磁盤和內(nèi)存空間。在之前傳統(tǒng)非共享庫中,一個代碼段簡單的附加到程序中,如果另一個程序同時需要調(diào)用該代碼段時,則會在內(nèi)存中出現(xiàn)兩個相同的代碼段。動態(tài)鏈接庫在內(nèi)存中只有一個實(shí)例。
DLL與LIB的關(guān)系
咋一看:lib是靜態(tài)鏈接庫;DLL是動態(tài)鏈接庫,一個編譯時提供;一個運(yùn)行時提供,完了。
其實(shí)沒那么簡單! lib也有靜態(tài)lib和動態(tài)lib之分。
靜態(tài)lib:它將導(dǎo)出聲明和實(shí)現(xiàn)均放到lib中,編譯后所有代碼都嵌入到宿主程序中去。
動態(tài)lib:相當(dāng)于一個h文件,它是對實(shí)現(xiàn)部分(.DLL)的導(dǎo)出部分的聲明。編譯后只是將導(dǎo)出聲明部分編譯到宿主程序中,運(yùn)行時需要相應(yīng)的DLL文件的支持,否則無法工作。當(dāng)生成一個新的DLL時,也會有配套的lib產(chǎn)生(即二者需一起分發(fā)),此時的lib即為動態(tài)lib。
上文引自:http://blog.csdn.net/heyabo/article/details/8721611
?使用動態(tài)dll有兩種方法,一種是隱式鏈接,一種顯示鏈接,如果用loadlibrary就是顯示鏈接,用lib就屬于隱式鏈接
dll是個編譯好的程序,調(diào)用時可以直接調(diào)用其中的函數(shù),?不參加工程的編譯。而lib應(yīng)該說是一個程序集,?只是把一些相應(yīng)的函數(shù)總結(jié)在一起,?如果調(diào)用lib中的函數(shù),?在工程編譯時,這些調(diào)用的函數(shù)都將參加編譯。
簡單講,靜態(tài)庫就是直接將需要的代碼連接進(jìn)可執(zhí)行程序;動態(tài)庫就是在需要調(diào)用其中的函數(shù)時,根據(jù)函數(shù)映射表找到該函數(shù)然后調(diào)入堆棧執(zhí)行。 ??
做成靜態(tài)庫可執(zhí)行文件本身比較大,但不必附帶動態(tài)庫 ??
做成動態(tài)庫可執(zhí)行文件本身比較小,但需要附帶動態(tài)庫
?實(shí)例
1.通過Loadlibrary顯式調(diào)用DLL
a.新建工程,生成動態(tài)庫DLL;(我們發(fā)現(xiàn)在生成動態(tài)庫DLL的同時會生成一個同名的Lib)
//MyDll.h extern "C" __declspec (dllexport) int Add(int a,int b); //將Add作為導(dǎo)出函數(shù)//MyDll.cpp int Add(int a,int b) {return a+b; }b.通過主函數(shù)調(diào)用
//Main.cpp #include <stdio.h> __declspec(dllimport) int Add(int ,int );typedef int (*pAdd)(int ,int); int _tmain(int argc, _TCHAR* argv[]) {HINSTANCE hDll;pAdd Add;hDll=LoadLibrary("MyDll.dll");if (hDll){Add=(pAdd)GetProcAddress(hDll,"Add");}printf("a+b=%d\n",Add(10,15));return 0; }運(yùn)行結(jié)果:
2.通過Lib隱式調(diào)用DLL(*.h+*.lib+*.dll)
a.將MyDll.h、MyDll.lib和MyDll.dll拷貝至Main工程中;
b.將MyDll.h添加至Main工程;
c.將MyDll.lib添加至Main工程的“附加依賴項(xiàng)”中;
d.在Main中調(diào)用Add。
//Main.pp #include <stdio.h>int _tmain(int argc, _TCHAR* argv[]) {printf("a+b=%d\n",Add(10,15));return 0; }e.刪除Main工程中的MyDll.dll,再次編譯鏈接Main工程。編譯鏈接均成功,單運(yùn)行時會有如下提示:
3.直接調(diào)用靜態(tài)庫
?將MyDll工程設(shè)置為生成靜態(tài)庫Lib,通過布置2中的方法調(diào)用Add函數(shù),不需要MyDll.dll能運(yùn)行成功。
?
轉(zhuǎn)載于:https://my.oschina.net/871120/blog/295219
總結(jié)
以上是生活随笔為你收集整理的Windows 动态链接库DLL浅解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android学习3—电话拨号器
- 下一篇: 自制蚊虫咬伤药液