如何從DLL中生成LIB文件_第1頁
如何從DLL中生成LIB文件_第2頁
如何從DLL中生成LIB文件_第3頁
如何從DLL中生成LIB文件_第4頁
如何從DLL中生成LIB文件_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、如何從DLL中生成LIB文件如何從dll文件導(dǎo)岀對應(yīng)的lib文件?Visual C+ 開發(fā)工具提供了兩個(gè)命令行工具, 一個(gè)是dumpbin.exe,另一個(gè)是lib.exe。利用這兩 個(gè)工具即可從dll導(dǎo)岀其對應(yīng)的lib。1、在命令行執(zhí)行:dumpb in /exports yourdll.dll > yourdll.def2、 編輯 yourdll.def文件,使之格式與.def文件格式一致。比如:EXPORTS;fn1;fn2;3、在命令行執(zhí)行:lib /def:yourdll.def/machi ne:i386/out:yourdll.lib為無LIB的DLL制作LIB函數(shù)符號輸入庫

2、本文介紹了在VC中針對無LIB時(shí)的DLL隱式鏈接,制作可供VC+使用的LIB函數(shù)符號輸入庫。具 體步驟如下:一、使用VC+的工具DUMPBIN將DLL中的導(dǎo)岀函數(shù)表導(dǎo)岀到一定義(.DEF)文件EXAMPLE :DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def二、將導(dǎo)岀的.DEF文件整理為一符合.DEF個(gè)數(shù)的函數(shù)導(dǎo)岀文件EXAMPLE :VideoDeCoder.DEF文件內(nèi)容如下 Dump of file VideoDeCoder.dllFile Type: DLLSecti oncontains thefollowi ngexpo

3、rtsforVideoDeCoder.dll0characteristics3D49E48F timedate stampFriAug0209:46:5520020.00 version1 ordinal base11 n umber offun cti ons11n umber of n amesordi nal hint RVAn ame1000010F60_TM_ClearDecoderBuff42100010E80_TM_CloseDecoder43200010F00_TM_DecodePicture44300010ED0_TM_DecodePictureHeader45400010F

4、D0_TM_GetFileE nd46500011030_TM_GetUValue47600011060_TM_GetVValue48700011000_TM_GetYValue49800010E10_TM_Ope nDecoder810900010F30_TM_Retur nType411A00010F90_TM_SetFileE nd8Summary2000.data1000.rdata1000.reloc15000.text按照以下方法整理1)添加LIB說明LIBRARY"VideoDeCoder"DESCRIPTION "VideoDeCoder libr

5、ary"2)去掉導(dǎo)岀函數(shù)說明端以外的內(nèi)容,在LIB說明下添加"VideoDeCoder""xx"為DLL名稱"EXPROTS"說明導(dǎo)岀函數(shù)LIBRARYDESCRIPTION"VideoDeCoder library"EXPORTSordinal hintRVAname1000010F60_TM_ClearDecoderBuff42100010E80_TM_CloseDecoder43200010F00_TM_DecodePicture4300010ED0_TM_DecodePictureH5400010

6、FD0_TM_GetFileE nd46500011030_TM_GetUValue47600011060_TM_GetVValue48700011000_TM_GetYValue49800010E10_TM_Ope nDecoder810900010F30_TM_ReturnType411A00010F90_TM_SetFileE nd83)將所有的函數(shù)放至行首去掉 "hint" 和 "RVA" 數(shù)據(jù),留下函數(shù)的序號"ordinal",在序號前加上"" 符號 形成"_導(dǎo)岀函數(shù)名參數(shù)字節(jié)和序號“此種格式(

7、_stdcall方式調(diào)用導(dǎo)岀的函數(shù)符號是"函數(shù)名稱參數(shù)字節(jié)和").最后形成.DEF文件如下:LIBRARY"VideoDeCoder"DESCRIPTION "VideoDeCoder library"EXPORTSTM_ClearDecoderBuff4TM_CloseDecoder4TM_DecodePicture4TM_DecodePictureHeader4TM_GetFileE nd4TM_GetUValue4TM_GetVValue4TM_GetYValue4TM_Ope nDecoder8TM_ReturnType4TM

8、_SetFileE nd8三、使用VC+的LIB工具,帶/DEF:(.def文件名) 格式的的LIB文件了 .1234567891011/MACHINE:IX86(80X86 機(jī)器),就輸岀符合 VC+EXAMPLE:LIB /DEF:VideoDeCoder.def /MACHINE:IX86四、接時(shí)帶上LIB文件鏈接;注意的是當(dāng)有些動態(tài)庫 DUMPBIN的只有函數(shù)名,無"nn"的參數(shù)格式,如 C+Builder寫的DLL,輸岀就只有 函數(shù)名符號,鏈接時(shí)就會報(bào)錯:error LNK2002:unresolved externalsymbol"functionna

9、menn"提示程序中引入的函數(shù)符號無法識別,這時(shí)只要將DEF文件中相應(yīng)的函數(shù)名稱改為functionnamenn方式,重新建立LIB,重新鏈接即可.def文件格式以下摘自MSDN,希望有幫助。不過在 VC下編程好像用不著自己定義 DEF文件:模塊定義(.def) 文件模塊定義(.def)文件為鏈接器提供有關(guān)被鏈接程序的導(dǎo)岀、屬性及其他方面的信息。生成DLL 時(shí),.def文件最有用。由于存在可代替模塊定義語句使用的鏈接器選項(xiàng),通常不需要.def文件。也可以將 _declspec(dllexport)用作指定導(dǎo)岀函數(shù)的手段。在鏈接器階段可以使用/DEF (指定模塊定義文件)鏈接器選項(xiàng)調(diào)用

10、.def 文件。如果生成的.exe 文件沒有導(dǎo)岀,使用.def文件將使輸岀文件較大并降低加載速度。模塊定義語句的規(guī)則下列語法規(guī)則適用于.def文件中的所有語句。其他適用于特定語句的規(guī)則與各語句一起加以說明。語句、屬性關(guān)鍵字和用戶指定的標(biāo)識符區(qū)分大小寫。包含空格或分號(;)的長文件名必須用引號(“) 引起。使用一個(gè)或多個(gè)空格、制表符或換行符,將語句關(guān)鍵字同其參數(shù)分開和將各語句分開。指定參數(shù)的 冒號(:)或等號(=)兩旁有零個(gè)或多個(gè)空格、制表符或換行符。如果使用NAME 或 LIBRARY語句,則這些語句必須位于所有其他語句之前。在 .def 文件中,SECTIONS 和EXPORTS 語句可以岀

11、現(xiàn)多次。每個(gè)語句都可以采用多個(gè)規(guī)范,各規(guī)范間必須用一個(gè)或多個(gè)空格、制表符或換行符分開。語句關(guān)鍵字必須在第一個(gè)規(guī)范的前 面岀現(xiàn)一次,并且可以在每個(gè)附加規(guī)范的前面重復(fù)。許多語句都具有等效的LINK命令行選項(xiàng)。有關(guān)其他詳細(xì)信息,請參閱相應(yīng)的LINK 選項(xiàng)說明。.def 文件中的注釋由每個(gè)注釋行開始處的分號(;)指定。注釋不能與語句共享一行,但可以在多行語句的規(guī)范間岀現(xiàn)。(SECTIONS 和 EXPORTS 為多行語句。)以十進(jìn)制或十六進(jìn)制為基礎(chǔ)指定數(shù)值參數(shù)。如果字符串參數(shù)與保留字匹配,則必須用雙引號(“) 將字符串參數(shù)引起。DESCRIPTION "text"該語句將字符串寫入

12、 .rdata 節(jié)。將指定的text 用單引號或雙引號( 或 ”)引起。若要在字符串中使用引號(單引號或雙引號),請用其他類型的標(biāo)記括住字符串。在模塊定義文件中,DESCRIPTION僅在生成虛擬設(shè)備驅(qū)動程序(VxD)時(shí)有效。EXETYPE:d yn amic| dev386在模塊定義文件中,EXETYPE僅在生成虛擬設(shè)備驅(qū)動程序(VxD)時(shí)有效。如果生成虛擬設(shè)備驅(qū)動程序時(shí)在模塊定義文件中沒有指定EXETYPE,并且如果沒有指定/EXETYPE 鏈接器選項(xiàng),則靜態(tài)加載(dev386) 生效。EXPORTSdefi niti onsEXPORTS 語句引入了一個(gè)由一個(gè)或多個(gè)definitions

13、 (導(dǎo)岀的函數(shù)或數(shù)據(jù))組成的節(jié)。每個(gè)定義必須在單獨(dú)一行上。EXPORTS 關(guān)鍵字可以在第一個(gè)定義所在的同一行上或在前一行上。.def文件可以包含一個(gè)或多個(gè) EXPORTS 語句。導(dǎo)岀defi ni tio ns的語法為:entryn ame=i nter naln ameordi nal NONAME PRIVATE DATAentryn ame 是要導(dǎo)岀的函數(shù)名或變量名。這是必選項(xiàng)。如果導(dǎo)岀的名稱與DLL 中的名稱不同,則通過in ternal name 指定 DLL中導(dǎo)岀的名稱。例如,如果DLL 導(dǎo)岀函數(shù)func1(),要將它用作func2(),則應(yīng)指定:EXPORTSfun c2=fu

14、nc1ordi nal允許指定是序號而不是函數(shù)名將進(jìn)入DLL的導(dǎo)岀表。這有助于最小化DLL的大小。 LIB文件將包含序號與函數(shù)之間的映射,這使您得以像通常在使用DLL的項(xiàng)目中那樣使用函數(shù)名??蛇x的 NONAME關(guān)鍵字允許只按序號導(dǎo)岀,并減小結(jié)果DLL中導(dǎo)岀表的大小。但是,如果要在DLL 上使用GetProcAddress,則必須知道序號,因?yàn)槊Q將無效??蛇x的 PRIVATE關(guān)鍵字禁止將entryn ame 放到由 LINK生成的導(dǎo)入庫中。它對同樣是由 LINK生成的圖像中的導(dǎo)岀無效??蛇x的 DATA 關(guān)鍵字指定導(dǎo)岀的是數(shù)據(jù),而不是代碼。例如,可以導(dǎo)岀數(shù)據(jù)變量,如下所示:EXPORTSi DA

15、TA當(dāng)對同一導(dǎo)岀使用PRIVATE 和 DATA 時(shí),PRIVATE 必須位于DATA的前面。有三種導(dǎo)岀定義的方法,按照建議的使用順序依次為:源代碼中的_declspec(dllexport)關(guān)鍵字.def 文件中的EXPORTS 語句LINK命令中的/EXPORT 規(guī)范所有這三種方法可以用在同一個(gè)程序中。LINK在生成包含導(dǎo)岀的程序時(shí)還創(chuàng)建導(dǎo)入庫,除非生成中使用了.exp 文件。以下是 EXPORTS節(jié)的示例:EXPORTSDllCa nUn loadNowDllWi ndowName = NameDllGetClassObject4DllRegisterServer7Dll Un regi

16、sterServer注意,使用 .def 文件從 DLL.declspec(dllexport)。但是,在任何使用 declspec(dllimport)。1PRIVATEDATADATANONAMEPRIVATE中導(dǎo)岀變量時(shí),不需要在變量上指定DLL的文件中,仍必須在數(shù)據(jù)聲明上使用LIBRARY libraryBASE=address該語句通知LINK 創(chuàng)建 DLL oLINK同時(shí)還創(chuàng)建導(dǎo)入庫,除非生成中使用了.exp 文library 參數(shù)指定 DLL的名稱。也可以使用/out 鏈接器選項(xiàng)指定 DLL輸岀名。BASE=address 參數(shù)設(shè)置操作系統(tǒng)用來加載DLL 的基址。該參數(shù)重寫 0x

17、10000000 的默認(rèn) DLL位置。有關(guān)基址的詳細(xì)信息,請參閱 /BASE選項(xiàng)說明。請記住,在生成DLL 時(shí)使用 /DLL鏈接器選項(xiàng)。/HEAP:reserve,commitHEAPSIZE所展示的功能與/HEAP鏈接器選項(xiàng)相同。NAMEapplicatio n BASE=address鏈接器選項(xiàng),而另/OUT 重寫該語句指定主輸岀文件的名稱。另一種指定輸岀文件名的方法是使用/out一種設(shè)置基址的方法是使用/BASE 鏈接器選項(xiàng)。如果兩種方法都指定了,則NAME。如果生成DLL,NAME將只影響DLL 名SECTIONS defi niti onsSECTIONS 語句引入了一個(gè)由一個(gè)或多個(gè)

18、definitions (關(guān)于項(xiàng)目輸岀文件各節(jié)的訪問說明符)組成的節(jié)。每個(gè)定義必須在單獨(dú)一行上。 SECTIONS 關(guān)鍵字可以在第一個(gè)定義所在的同一行或前 一行上。.def 文件可以包含一個(gè)或多個(gè) SECTIONS 語句。該 SECTIONS 語句為圖像文件中的一節(jié)或多節(jié)設(shè)置屬性,并可用于重寫每種節(jié)類型的默認(rèn)屬 性。defi ni tio ns的格式為:.sectio n_n ame specifier此處,. 為程序圖像中的節(jié)名,specifier為下列一個(gè)或多個(gè)訪問修飾符:EXECUTEREADSHAREDWRITE用空格分開修飾符名。例如:SECTIONS.rdata READ WRITESECTIONS 標(biāo)記 defi ni tio ns 節(jié)列表的開始位置。每個(gè)定義必須在單獨(dú)一行上。 SECTIONS 關(guān)鍵字可以在第一個(gè)定義所在的同一行或前一行上。.def 文件可以包含一個(gè)或多個(gè) SECTIONS語句。支持 SEGMENTS 關(guān)鍵字作為 SECTIONS 的同義詞。Visual C+的早期版本支持:secti onCLASS'class name' specifier岀

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論