創(chuàng)建動(dòng)態(tài)鏈接庫 (DLL) 項(xiàng)目:
1、從“文件”菜單中,選擇“新建”,然后選擇“項(xiàng)目…”。
2、在“項(xiàng)目類型”窗格中,選擇“Visual C++”下的“Win32”。
3、在“模板”窗格中,選擇“Win32 控制臺(tái)應(yīng)用程序”。
4、為項(xiàng)目選擇一個(gè)名稱,如 MathFuncsDll,并將其鍵入“名稱”字段。 為解決方案選擇一個(gè)名稱,如 DynamicLibrary,并將其鍵入“解決方案名稱”字段。
5、單擊“確定”啟動(dòng) Win32 應(yīng)用程序向?qū)А?在“Win32 應(yīng)用程序向?qū)?#8221;對(duì)話框的“概述”頁中,單擊“下一步”。
6、在“Win32 應(yīng)用程序向?qū)?#8221;中的“應(yīng)用程序設(shè)置”頁中,選擇“應(yīng)用程序類型”下的“DLL”(如果可用),或者選擇“控制臺(tái)應(yīng)用程序”(如果“DLL”不可用)。 某些版本的 Visual Studio 不支持通過使用向?qū)?chuàng)建 DLL 項(xiàng)目。 您可以稍后對(duì)此進(jìn)行更改,以將項(xiàng)目編譯為 DLL。
7、在“Win32 應(yīng)用程序向?qū)?#8221;的“應(yīng)用程序設(shè)置”頁中,選擇“附加選項(xiàng)”下的“空項(xiàng)目”。
8、單擊“完成”創(chuàng)建項(xiàng)目。
9、創(chuàng)建導(dǎo)出的類或函數(shù)等,必須在類或函數(shù)前加上 __declspec(dllexport) 修飾符。 這些修飾符使 DLL 能夠?qū)С鲈擃惢蚝瘮?shù)以供其他應(yīng)用程序使用。
調(diào)用動(dòng)態(tài)鏈接庫 (DLL):
1、【C++】->【General】->【additional include directories】 // 添加頭文件目錄
2、【Linker】->【General】->【additional library directories】 // 添加lib目錄
3、【linker】->【input】->【additional dependencies】 // 添加lib文件名
將.dll可以放到工程生成的exe文件夾里面,運(yùn)行exe就可以直接在當(dāng)前目錄下找到需要的dll文件。(真正的函數(shù)的可執(zhí)行代碼都在dll中,lib文件僅僅只是一個(gè)索引,而.h文件僅僅只是一個(gè)對(duì)外的接口)
動(dòng)態(tài)庫的三個(gè)組成部分
.h文件作用 : 聲明函數(shù)接口
.lib文件作用: 告訴鏈接器調(diào)用的函數(shù)在哪個(gè)DLL中
.dll文件作用: 函數(shù)可執(zhí)行代碼
.h頭文件是編譯時(shí)必須的,lib是鏈接時(shí)需要的,dll是運(yùn)行時(shí)需要的。完成源代碼的編譯和鏈接,有.h和.lib就夠了。要使動(dòng)態(tài)連接的程序運(yùn)行起來,有.dll就夠了。在開發(fā)和調(diào)試階段,當(dāng)然最好都有。
當(dāng)我們?cè)谧约旱某绦蛑幸昧艘粋€(gè)H文件里的函數(shù),編鏈器怎么知道該調(diào)用哪個(gè)DLL文件呢?這就是LIB文件的作用: 告訴鏈接器 調(diào)用的函數(shù)在哪個(gè)DLL中,函數(shù)執(zhí)行代碼在DLL中的什么位置,這也就是為什么需要附加依賴項(xiàng) .LIB文件,它起到橋梁的作用。如果生成靜態(tài)庫文件,則沒有DLL ,只有l(wèi)ib,這時(shí)函數(shù)可執(zhí)行代碼部分也在lib文件中
目前以lib后綴的庫有兩種,一種為靜態(tài)鏈接庫(Static Libary,以下簡稱“靜態(tài)庫”),另一種為動(dòng)態(tài)連接庫(DLL,以下簡稱“動(dòng)態(tài)庫”)的導(dǎo)入庫(Import Libary,以下簡稱“導(dǎo)入庫”)。靜態(tài)庫是一個(gè)或者多個(gè)obj文件的打包,所以有人干脆把從obj文件生成lib的過程稱為Archive,即合并到一起。比如你鏈接一個(gè)靜態(tài)庫,如果其中有錯(cuò),它會(huì)準(zhǔn)確的找到是哪個(gè)obj有錯(cuò),即靜態(tài)lib只是殼子。動(dòng)態(tài)庫一般會(huì)有對(duì)應(yīng)的導(dǎo)入庫,方便程序靜態(tài)載入動(dòng)態(tài)鏈接庫,否則你可能就需要自己LoadLibary調(diào)入DLL文件,然后再手工GetProcAddress獲得對(duì)應(yīng)函數(shù)了。有了導(dǎo)入庫,你只需要鏈接導(dǎo)入庫后按照頭文件函數(shù)接口的聲明調(diào)用函數(shù)就可以了。導(dǎo)入庫和靜態(tài)庫的區(qū)別很大,他們實(shí)質(zhì)是不一樣的東西。靜態(tài)庫本身就包含了實(shí)際執(zhí)行代碼、符號(hào)表等等,而對(duì)于導(dǎo)入庫而言,其實(shí)際的執(zhí)行代碼位于動(dòng)態(tài)庫中,導(dǎo)入庫只包含了地址符號(hào)表等,確保程序找到對(duì)應(yīng)函數(shù)的一些基本地址信息。