VC中無LIB時的DLL隱式連結,製作與VC++相符合的LIB函式符號輸入庫 (轉)
請大家注意!這種方法只能應用於輸出為C格式的__stdcall方式!
1. 使用VC++的工具DUMPBIN將DLL中的匯出表匯出到一定義(.DEF)
EXAMPLE:
DUMPBIN VoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
2. 將匯出的.DEF檔案整理為一符合.DEF個數的函式匯出檔案
EXAMPLE:
VideoDeCoder.DEF 檔案內容如下
Dump of file VideoDeCoder.dll
File Type: DLL
Section contains the following exports for VideoDeCoder.dll
0 characteristics
3D49E48F time date stamp Fri Aug 02 09:46:55 2002
0.00 version
1 ordinal base
11 number of functions
11 number of names
ordinal hint RVA name
1 0 00010F60 to:_TM_ClearDecoderBuff@4">_TM_ClearDecoderBuff@4
2 1 00010E80
3 2 00010F00
4 3 00010ED0
5 4 00010FD0
6 5 00011030
7 6 00011060
8 7 00011000
9 8 00010E10
10 9 00010F30
11 A 00010F90
Summary
2000 .data
1000 .rdata
1000 .reloc
15000 .text
按照以下方法整理:
1>新增LIB說明
LIBRARY "VideoDeCoder" ;"xx"為DLL名稱
DESCRIPTION "VideoDeCoder library"
2>去掉匯出函式說明端以外的內容,在LIB說明下新增 "EXPROTS" 說明匯出函式
LIBRARY "VideoDeCoder"
DESCRIPTION "VideoDeCoder library"
EXPORTS
ordinal hint RVA name
1 0 00010F60
2 1 00010E80
3 2 00010F00 _TM_DecodePicture@
4 3 00010ED0 _TM_DecodePictureH
5 4 00010FD0
6 5 00011030
7 6 00011060
8 7 00011000
9 8 00010E10
10 9 00010F30
11 A 00010F90
3>將所有的函式放至行首,去掉 "hint" 和 "RVA" 資料,留下函式的序號 "ordinal" ,在序號前加上 "@" 符號
形成 "_匯出函式名@引數位元組和 @序號" 此種格式(__stdcall 方式呼叫匯出的函式符號是 "函式名稱@引數位元組和").
最後形成.DEF檔案如下:
LIBRARY "VideoDeCoder"
DESCRIPTION "VideoDeCoder library"
EXPORTS
@1
@2
@3
@4
@5
@6
@7
@8
@9
@10
@11
3. 使用VC++的LIB工具,帶/DEF:(.def檔名) /MACHINE:IX86(80X86機器),就輸出符合VC++格式的的LIB檔案了.
EXAMPLE:
LIB /DEF:VideoDeCoder.def /MACHINE:IX86
4. 接時帶上LIB檔案連結;注意的是當有些動態庫DUMPBIN的只有函式名,無"@nn"的引數格式,如C++Builder寫的DLL,輸出就只有函式名符號,連結時就會報錯:
error LNK2002:unresolved external symbol ""
提示中引入的函式符號無法識別,這時只要將DEF檔案中相應的函式名稱改為方式,重新建立
LIB,重新連結即可.
這樣就製作成功了符合VC呼叫方式的LIB了!
參考:MSDN2000
要值得一說的是!BORLAND C++BUILDER有一個很好的工具IMPDEF可以直接將DLL中的函式輸出到.DEF檔案中,只要做一點點修改就可以成為符合VC的DEF檔案!
IMPDEF xxx.def xxx.dll
這種方法只能應用於輸出為C格式的__stdcall呼叫方式經過我的論證有些錯誤!我利用Borland C++和VC++做論證,發現:
而在C++BUILDER中!
__cdecl的函式輸出前會帶一"_"
__stdcall無特徵,只輸出函式名
__fastcall函式輸出前帶一"@"
都無"@nn"字尾格式!
在VC中!
__cdecl無特徵,只輸出函式名
__stdcall的函式輸出前會帶一"
__fastcall函式輸出前帶一"@"字尾帶"@nn
只要將BC的DEF檔案中函式申明格式轉換為VC識別的格式就可以利用LIB工具生成LIB;要使用C分格輸出(extern "C")才是必須的!而且別忘了在DEF檔案中的函式申明不要帶“_”啊!:)不然會出現error LNK2001的連結錯誤!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993803/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- VC6.0 設定動態連結庫工程生成dll以及lib檔案的位置
- VC++的DLL應用C++
- VC6修改lib檔案的輸出路徑
- 再談在VB中呼叫VC++開發的DLL (轉)C++
- 製作FFmpeg動態庫(make ffmpeg dynamic lib)
- dll、Lib、obj、.h檔案的區別與作用OBJ
- VC++中STL的使用 (轉)C++
- Excel函式應用教程:函式的輸入方法(轉)Excel函式
- php中函式前加&符號的作用分解PHP函式符號
- 移植 Python 量化交易 TA-Lib 庫到函式計算Python函式
- PHP連結oracle的函式 (轉)PHPOracle函式
- Windows下的VC++動態連結庫程式設計WindowsC++程式設計
- 實戰VC時間控制函式 (轉)函式
- VC++的DLL應用(含Demo演示)C++
- C#中的輸入框函式C#函式
- VC++基礎 連結串列的操作示例C++
- C++ 多個類的 DLL 封裝以及隱式連結和顯式連結 2 種方法呼叫C++封裝
- python函式符號sympy的用法Python函式符號
- VC 6中使用不同呼叫規範的函式在符號檔案裡的表示方式函式符號
- VS載入lib庫的三種方法
- 將連線資料庫的程式碼隱藏在DLL中(轉)資料庫
- VS如何將核心函式封裝成dll、lib,並供給第三方呼叫?函式封裝
- .dll,.lib,.def 和 .exp檔案
- ncurses輸入函式:字元+字串的輸入函式字元字串
- VC執行庫版本不同導致連結.LIB靜態庫時發生重複定義問題的一個案例分析和總結
- XML中輸入特殊符號XML符號
- Qt設定根據編譯器不同連結不同的lib庫QT編譯
- VC++ 程 序 中 用 對 話 框 的 形 式 顯 示HTML 文 件 (轉)C++HTML
- 封裝動態庫dll與靜態庫lib(原理及簡單例項)封裝單例
- 定義一個函式,輸入一個連結串列的頭節點,反轉該連結串列並輸出反轉後連結串列的頭節點函式
- matlab符號函式的求導與差分的計算Matlab符號函式求導
- 用VC++ 6.0製作網路自動測試程式 (轉)C++
- [C語言] 將32位 int有符號型別的十進位制資料 反轉輸出 [無需任何庫函式]C語言符號型別函式
- VC++ 呼叫 C#生成DLL的兩種方法C++C#
- to_date函式與當前系統時間格式可否隱式轉換問題總結函式
- 連結使用的符號符號
- ruby **option作為函式引數,map的key必須是符號函式符號
- 製作可以自動隱藏的彈出式選單 (轉)