Windows 动态链接库DLL浅解
為什么80%的碼農都做不了架構師?>>> ??
動態鏈接庫(DLL),即:Dynamic Link Library。一個包含可由多個程序同時使用的代碼和數據的庫,DLL不是可執行文件。
設計動態鏈接庫初衷是為了節約應用程序的磁盤和內存空間。在之前傳統非共享庫中,一個代碼段簡單的附加到程序中,如果另一個程序同時需要調用該代碼段時,則會在內存中出現兩個相同的代碼段。動態鏈接庫在內存中只有一個實例。
DLL與LIB的關系
咋一看:lib是靜態鏈接庫;DLL是動態鏈接庫,一個編譯時提供;一個運行時提供,完了。
其實沒那么簡單! lib也有靜態lib和動態lib之分。
靜態lib:它將導出聲明和實現均放到lib中,編譯后所有代碼都嵌入到宿主程序中去。
動態lib:相當于一個h文件,它是對實現部分(.DLL)的導出部分的聲明。編譯后只是將導出聲明部分編譯到宿主程序中,運行時需要相應的DLL文件的支持,否則無法工作。當生成一個新的DLL時,也會有配套的lib產生(即二者需一起分發),此時的lib即為動態lib。
上文引自:http://blog.csdn.net/heyabo/article/details/8721611
?使用動態dll有兩種方法,一種是隱式鏈接,一種顯示鏈接,如果用loadlibrary就是顯示鏈接,用lib就屬于隱式鏈接
dll是個編譯好的程序,調用時可以直接調用其中的函數,?不參加工程的編譯。而lib應該說是一個程序集,?只是把一些相應的函數總結在一起,?如果調用lib中的函數,?在工程編譯時,這些調用的函數都將參加編譯。
簡單講,靜態庫就是直接將需要的代碼連接進可執行程序;動態庫就是在需要調用其中的函數時,根據函數映射表找到該函數然后調入堆棧執行。 ??
做成靜態庫可執行文件本身比較大,但不必附帶動態庫 ??
做成動態庫可執行文件本身比較小,但需要附帶動態庫
?實例
1.通過Loadlibrary顯式調用DLL
a.新建工程,生成動態庫DLL;(我們發現在生成動態庫DLL的同時會生成一個同名的Lib)
//MyDll.h extern "C" __declspec (dllexport) int Add(int a,int b); //將Add作為導出函數//MyDll.cpp int Add(int a,int b) {return a+b; }b.通過主函數調用
//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; }運行結果:
2.通過Lib隱式調用DLL(*.h+*.lib+*.dll)
a.將MyDll.h、MyDll.lib和MyDll.dll拷貝至Main工程中;
b.將MyDll.h添加至Main工程;
c.將MyDll.lib添加至Main工程的“附加依賴項”中;
d.在Main中調用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工程。編譯鏈接均成功,單運行時會有如下提示:
3.直接調用靜態庫
?將MyDll工程設置為生成靜態庫Lib,通過布置2中的方法調用Add函數,不需要MyDll.dll能運行成功。
?
轉載于:https://my.oschina.net/871120/blog/295219
總結
以上是生活随笔為你收集整理的Windows 动态链接库DLL浅解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android学习3—电话拨号器
- 下一篇: 关于系统异常设计的再思考