資源描述:
《dll與lib文件的區(qū)別》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、DLL與LIB文件的區(qū)別??共有兩種庫:一種是LIB包含了函數(shù)所在的DLL文件和文件中函數(shù)位置的信息(入口),代碼由運(yùn)行時(shí)加載在進(jìn)程空間中的DLL提供,稱為動(dòng)態(tài)鏈接庫dynamiclinklibrary。一種是LIB包含函數(shù)代碼本身,在編譯時(shí)直接將代碼加入程序當(dāng)中,稱為靜態(tài)鏈接庫staticlinklibrary。共有兩種鏈接方式:動(dòng)態(tài)鏈接使用動(dòng)態(tài)鏈接庫,允許可執(zhí)行模塊(.dll文件或.exe文件)僅包含在運(yùn)行時(shí)定位DLL函數(shù)的可執(zhí)行代碼所需的信息。靜態(tài)鏈接使用靜態(tài)鏈接庫,鏈接器從靜態(tài)鏈接庫LIB獲取所有被引用函數(shù),并將庫同
2、代碼一起放到可執(zhí)行文件中。關(guān)于lib和dll的區(qū)別如下:(1)lib是編譯時(shí)用到的,dll是運(yùn)行時(shí)用到的。如果要完成源代碼的編譯,只需要lib;如果要使動(dòng)態(tài)鏈接的程序運(yùn)行起來,只需要dll。(2)如果有dll文件,那么lib一般是一些索引信息,記錄了dll中函數(shù)的入口和位置,dll中是函數(shù)的具體內(nèi)容;如果只有l(wèi)ib文件,那么這個(gè)lib文件是靜態(tài)編譯出來的,索引和實(shí)現(xiàn)都在其中。使用靜態(tài)編譯的lib文件,在運(yùn)行程序時(shí)不需要再掛動(dòng)態(tài)庫,缺點(diǎn)是導(dǎo)致應(yīng)用程序比較大,而且失去了動(dòng)態(tài)庫的靈活性,發(fā)布新版本時(shí)要發(fā)布新的應(yīng)用程序才行。(3)動(dòng)
3、態(tài)鏈接的情況下,有兩個(gè)文件:一個(gè)是LIB文件,一個(gè)是DLL文件。LIB包含被DLL導(dǎo)出的函數(shù)名稱和位置,DLL包含實(shí)際的函數(shù)和數(shù)據(jù),應(yīng)用程序使用LIB文件鏈接到DLL文件。在應(yīng)用程序的可執(zhí)行文件中,存放的不是被調(diào)用的函數(shù)代碼,而是DLL中相應(yīng)函數(shù)代碼的地址,從而節(jié)省了內(nèi)存資源。DLL和LIB文件必須隨應(yīng)用程序一起發(fā)行,否則應(yīng)用程序會(huì)產(chǎn)生錯(cuò)誤。如果不想用lib文件或者沒有l(wèi)ib文件,可以用WIN32API函數(shù)LoadLibrary、GetProcAddress裝載。使用lib需注意兩個(gè)文件:(1).h頭文件,包含lib中說明輸
4、出的類或符號(hào)原型或數(shù)據(jù)結(jié)構(gòu)。應(yīng)用程序調(diào)用lib時(shí),需要將該文件包含入應(yīng)用程序的源文件中。(2).LIB文件,略。使用dll需注意三個(gè)文件:(1).h頭文件,包含dll中說明輸出的類或符號(hào)原型或數(shù)據(jù)結(jié)構(gòu)的.h文件。應(yīng)用程序調(diào)用dll時(shí),需要將該文件包含入應(yīng)用程序的源文件中。(2).LIB文件,是dll在編譯、鏈接成功之后生成的文件,作用是當(dāng)其他應(yīng)用程序調(diào)用dll時(shí),需要將該文件引入應(yīng)用程序,否則產(chǎn)生錯(cuò)誤。如果不想用lib文件或者沒有l(wèi)ib文件,可以用WIN32API函數(shù)LoadLibrary、GetProcAddress裝載。
5、(3).dll文件,真正的可執(zhí)行文件,開發(fā)成功后的應(yīng)用程序在發(fā)布時(shí),只需要有.exe文件和.dll文件,并不需要.lib文件和.h頭文件。DLL與Lib的區(qū)別:1.DLL是一個(gè)編譯好的程序,調(diào)用時(shí)可以直接調(diào)用其中的函數(shù),不參加工程的編譯2.Lib是一個(gè)程序集,只是把相應(yīng)的函數(shù)總結(jié)在一起,如果調(diào)用Lib的函數(shù)在工程編譯時(shí),這些函數(shù)也參加編譯dll和lib文件??(1)lib是編譯時(shí)需要的,dll是運(yùn)行時(shí)需要的。如果要完成源代碼的編譯,有l(wèi)ib就夠了。如果也使動(dòng)態(tài)連接的程序運(yùn)行起來,有dll就夠了。在開發(fā)和調(diào)試階段,當(dāng)然最好都有
6、。(2)一般的動(dòng)態(tài)庫程序有l(wèi)ib文件和dll文件。lib文件是必須在編譯期就連接到應(yīng)用程序中的,而dll文件是運(yùn)行期才會(huì)被調(diào)用的。如果有dll文件,那么對應(yīng)的lib文件一般是一些索引信息,具體的實(shí)現(xiàn)在dll文件中。如果只有l(wèi)ib文件,那么這個(gè)lib文件是靜態(tài)編譯出來的,索引和實(shí)現(xiàn)都在其中。靜態(tài)編譯的lib文件有好處:給用戶安裝時(shí)就不需要再掛動(dòng)態(tài)庫了。但也有缺點(diǎn),就是導(dǎo)致應(yīng)用程序比較大,而且失去了動(dòng)態(tài)庫的靈活性,在版本升級(jí)時(shí),同時(shí)要發(fā)布新的應(yīng)用程序才行。(3)在動(dòng)態(tài)庫的情況下,有兩個(gè)文件,一個(gè)是引入庫(.LIB)文件,一個(gè)是D
7、LL文件,引入庫文件包含被DLL導(dǎo)出的函數(shù)的名稱和位置,DLL包含實(shí)際的函數(shù)和數(shù)據(jù),應(yīng)用程序使用LIB文件鏈接到所需要使用的DLL文件,庫中的函數(shù)和數(shù)據(jù)并不復(fù)制到可執(zhí)行文件中,因此在應(yīng)用程序的可執(zhí)行文件中,存放的不是被調(diào)用的函數(shù)代碼,而是DLL中所要調(diào)用的函數(shù)的內(nèi)存地址,這樣當(dāng)一個(gè)或多個(gè)應(yīng)用程序運(yùn)行是再把程序代碼和被調(diào)用的函數(shù)代碼鏈接起來,從而節(jié)省了內(nèi)存資源。從上面的說明可以看出,DLL和.LIB文件必須隨應(yīng)用程序一起發(fā)行,否則應(yīng)用程序?qū)?huì)產(chǎn)生錯(cuò)誤。(4).dll是在你的程序運(yùn)行的時(shí)候才連接的文件,因此它是一種比較小的可執(zhí)行
8、文件格式,.dll還有其他的文件格式如.ocx等,所有的.dll文件都是可執(zhí)行。.lib是在你的程序編譯連接的時(shí)候就連接的文件,因此你必須告知編譯器連接的lib文件在那里。一般來說,與動(dòng)態(tài)連接文件相對比,lib文件也被稱為是靜態(tài)連接庫。當(dāng)你把代碼編譯成這幾種格式的文件時(shí),在以后他們就不可能