久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

dll 和lib關(guān)系

 三山小熊 2010-12-23
問題:

一直沒搞清楚編譯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,這才是真正的 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多