問題: 一直沒搞清楚編譯dll后生成的lib文件到底是干什么用的,?如果采用靜態(tài)連接,為什么老是需要lib文件,?而通過loadlibrary則不需要,?如果是靜態(tài)連接,是否我的dll程序一旦改動而從新編譯過后,,就還需要從新編譯調(diào)用dll的程序,? 答案匯總: (rivershan) 程序員在建立一個DLL文件時,鏈接程序會自動生成一個與之對應(yīng)的LIB導(dǎo)入文件,。該文件包含了每一個DLL導(dǎo)出函數(shù)的符號名和可選的標(biāo)識號,,但是并不含有實際的代碼。LIB文件作為DLL的替代文件被編譯到應(yīng)用程序項目中,。 當(dāng)程序員通過靜態(tài)鏈接方式編譯生成應(yīng)用程序時,,應(yīng)用程序中的調(diào)用函數(shù)與LIB文件中導(dǎo)出符號相匹配,,這些符號或標(biāo)識號進入到生成的EXE文件中,。LIB文件中也包含了對應(yīng)的DLL文件名(但不是完全的路徑名),鏈接程序?qū)⑵浯鎯υ贓XE文件內(nèi)部,。當(dāng)應(yīng)用程序運行過程中需要加載DLL文件時,,Windows根據(jù)這些信息發(fā)現(xiàn)并加載DLL,然后通過符號名或標(biāo)識號實現(xiàn)對DLL函數(shù)的動態(tài)鏈接,。所有被應(yīng)用程序調(diào)用的DLL文件都會在應(yīng)用程序EXE文件加載時被加載在到內(nèi)存中,。可執(zhí)行程序鏈接到一個包含DLL輸出函數(shù)信息的輸入庫文件(.LIB文件),。操作系統(tǒng)在加載使用可執(zhí)行程序時加載DLL,。可執(zhí)行程序直接通過函數(shù)名調(diào)用DLL的輸出函數(shù),,調(diào)用方法和程序內(nèi)部其他的函數(shù)是一樣的,。 (stonespace) 調(diào)用dll的export函數(shù)是不需要lib的,dll本身就是和lib同一個級別的東西,,也提供類似的功能,,調(diào)用dll函數(shù)只需要loadlibrary就行,但是你也發(fā)現(xiàn),,用loadlibrary很麻煩,,要取出函數(shù)的地址,然后還要定義一個調(diào)用的原型,。用dll比用靜態(tài)鏈接庫lib要麻煩得多,。 微軟為了解決這個問題,,在編譯dll的時候,順便生成一個引入庫lib文件,,這個lib不包含實際功能代碼,,只不過用來幫你做那些loadlibrary的麻煩工作,讓你用dll和用一般的lib一樣方便,。 dll改過之后,,只要export函數(shù)的聲明沒有修改,也就是參數(shù),、函數(shù)名,、返回值沒有發(fā)生變化,調(diào)用代碼不需要重新編譯,。不過export函數(shù)聲明修改過就必須重編譯,。 (alphapiao) 使用動態(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)庫就是直接將需要的代碼連接進可執(zhí)行程序;動態(tài)庫就是在需要調(diào)用其中的函數(shù)時,,根據(jù)函數(shù)映射表找到該函數(shù)然后調(diào)入堆棧執(zhí)行,。 做成靜態(tài)庫可執(zhí)行文件本身比較大,但不必附帶動態(tài)庫 做成動態(tài)庫可執(zhí)行文件本身比較小,,但需要附帶動態(tài)庫 其它沒有什么對于程序員而言很大的區(qū)別 有的Unix可能不支持動態(tài)庫,,所以只好用靜態(tài)庫 DLL與LIB的區(qū)別: 1.DLL是一個完整程序,其已經(jīng)經(jīng)過鏈接,即不存在同名引用,且有導(dǎo)出表,與導(dǎo)入表 lib是一個代碼集(也叫函數(shù)集)他沒有鏈接,所以lib有冗余,當(dāng)兩個lib相鏈接時地址會重新建立,,當(dāng)然還有其它相關(guān)的不同,用lib.exe就知道了 2.在生成dll時,,經(jīng)常會生成一個.lib(導(dǎo)入與導(dǎo)出),這個lib實際上不是真正的函數(shù)集,其每一個導(dǎo)出導(dǎo)入函數(shù)都是跳轉(zhuǎn)指令,,直接跳轉(zhuǎn)到DLL中的位置,,這個目的是外面的程序調(diào)用dll時自動跳轉(zhuǎn) 3.實際上最常用的lib是由lib.exe把*.obj生成的lib,這才是真正的 |
|