如何從DLL中生成LIB檔案
如何從dll檔案匯出對應的lib檔案?
Visual C++ 開發工具提供了兩個命令列工具,一個是dumpbin.exe,另一個是lib.exe。利用這兩個工具即可從dll匯出其對應的lib。
1、在命令列執行:
dumpbin /exports yourdll.dll > yourdll.def
2、編輯 yourdll.def 檔案,使之格式與.def檔案格式一致 。比如:
EXPORTS;
fn1;
fn2;
3、在命令列執行:
lib /def:yourdll.def /machine:i386 /out:yourdll.lib
//為無LIB的DLL製作LIB函式符號輸入庫
本文介紹了在VC中針對無LIB時的DLL隱式連結,製作可供VC++使用的LIB函式符號輸入庫。具體步驟如下:
一、使用VC++的工具DUMPBIN將DLL中的匯出函式表匯出到一定義(.DEF)檔案
EXAMPLE:
DUMPBIN VideoDeCoder.dll /EXPROTS /OUT:VideoDeCoder.def
二、將匯出的.DEF檔案整理為一符合.DEF個數的函式匯出檔案
EXAMPLE:
VideoDeCoder.DEF 檔案內容如下
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
2 1 00010E80 [email protected]
3 2 00010F00 _T[email protected]
4 3 00010ED0 [email protected]
5 4 00010FD0 [email protected]
6 5 00011030 [email protected]
7 6 00011060 [email protected]
8 7 00011000 [email protected]
9 8 00010E10 [email protected]
10 9 00010F30 [email protected]
11 A 00010F90 [email protected]
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 [email protected]
2 1 00010E80 [email protected]
3 2 00010F00 [email protected]
4 3 00010ED0 _TM_DecodePictureH
5 4 00010FD0 [email protected]
6 5 00011030 [email protected]
7 6 00011060 [email protected]
8 7 00011000 [email protected]
9 8 00010E10 [email protected]
10 9 00010F30 [email protected]
11 A 00010F90 [email protected]
3)將所有的函式放至行首,去掉 "hint" 和 "RVA" 資料,留下函式的序號 "ordinal" ,在序號前加上 "@" 符號 形成 "_匯出函式名@引數位元組和 @序號" 此種格式(__stdcall 方式呼叫匯出的函式符號是 "函式名稱@引數位元組和"). 最後形成.DEF檔案如下: LIBRARY "VideoDeCoder"
DESCRIPTION "VideoDeCoder library"
EXPORTS
[email protected] @1
[email protected] @2
[email protected] @3
[email protected] @4
[email protected] @5
[email protected] @6
[email protected] @7
[email protected] @8
[email protected] @9
[email protected] @10
[email protected] @11
三、使用VC++的LIB工具,帶/DEF:(.def檔名) /MACHINE:IX86(80X86機器),就輸出符合VC++格式的的LIB檔案了.
EXAMPLE:LIB /DEF:VideoDeCoder.def /MACHINE:IX86
四、接時帶上LIB檔案連結;注意的是當有些動態庫DUMPBIN的只有函式名,無"@nn"的引數格式,如C++Builder寫的DLL,輸出就只有 函式名符號,連結時就會報錯: error LNK2002:unresolved external symbol "[email protected]" 提示程式中引入的函式符號無法識別,這時只要將DEF檔案中相應的函式名稱改為[email protected]方式,重新建立LIB,重新連結即可.
def檔案格式
以下摘自MSDN,希望有幫助。不過在VC下程式設計好像用不著自己定義DEF檔案:
模組定義 (.def) 檔案
模組定義 (.def) 檔案為連結器提供有關被連結程式的匯出、屬性及其他方面的資訊。生成 DLL 時,.def 檔案最有用。由於存在可代替模組定義語句使用的連結器選項,通常不需要 .def 檔案。也可以將__declspec(dllexport) 用作指定匯出函式的手段。
在連結器階段可以使用 /DEF(指定模組定義檔案)連結器選項呼叫 .def 檔案。
如果生成的 .exe 檔案沒有匯出,使用 .def 檔案將使輸出檔案較大並降低載入速度。
模組定義語句的規則
下列語法規則適用於 .def 檔案中的所有語句。其他適用於特定語句的規則與各語句一起加以說明。
語句、屬性關鍵字和使用者指定的識別符號區分大小寫。
包含空格或分號 (;) 的長檔名必須用引號 (") 引起。
使用一個或多個空格、製表符或換行符,將語句關鍵字同其引數分開和將各語句分開。指定引數的冒號 (:) 或等號 (=) 兩旁有零個或多個空格、製表符或換行符。
如果使用 NAME 或 LIBRARY 語句,則這些語句必須位於所有其他語句之前。
在 .def 檔案中,SECTIONS 和 EXPORTS 語句可以出現多次。每個語句都可以採用多個規範,各規範間必須用一個或多個空格、製表符或換行符分開。語句關鍵字必須在第一個規範的前面出現一次,並且可以在每個附加規範的前面重複。
許多語句都具有等效的 LINK 命令列選項。有關其他詳細資訊,請參閱相應的 LINK 選項說明。
.def 檔案中的註釋由每個註釋行開始處的分號 (;) 指定。註釋不能與語句共享一行,但可以在多行語句的規範間出現。(SECTIONS 和 EXPORTS 為多行語句。)
以十進位制或十六進位制為基礎指定數值引數。
如果字串引數與保留字匹配,則必須用雙引號 (") 將字串引數引起。
DESCRIPTION "text"
該語句將字串寫入 .rdata 節。將指定的 text 用單引號或雙引號(' 或 ")引起。若要在字串中使用引號(單引號或雙引號),請用其他型別的標記括住字串。
在模組定義檔案中,DESCRIPTION 僅在生成虛擬裝置驅動程式 (VxD) 時有效。
EXETYPE:dynamic | dev386
在模組定義檔案中,EXETYPE 僅在生成虛擬裝置驅動程式 (VxD) 時有效。如果生成虛擬裝置驅動程式時在模組定義檔案中沒有指定 EXETYPE,並且如果沒有指定 /EXETYPE 連結器選項,則靜態載入 (dev386) 生效。
EXPORTS
definitions
EXPORTS 語句引入了一個由一個或多個 definitions(匯出的函式或資料)組成的節。每個定義必須在單獨一行上。EXPORTS 關鍵字可以在第一個定義所在的同一行上或在前一行上。.def 檔案可以包含一個或多個 EXPORTS 語句。
匯出 definitions 的語法為:
entryname[=internalname] [@ordinal [NONAME]] [PRIVATE] [DATA]
entryname 是要匯出的函式名或變數名。這是必選項。如果匯出的名稱與 DLL 中的名稱不同,則通過 internalname 指定 DLL 中匯出的名稱。例如,如果 DLL 匯出函式 func1(),要將它用作 func2(),則應指定:
EXPORTS
func2=func1
@ordinal 允許指定是序號而不是函式名將進入 DLL 的匯出表。這有助於最小化 DLL 的大小。.LIB 檔案將包含序號與函式之間的對映,這使您得以像通常在使用 DLL 的專案中那樣使用函式名。
可選的 NONAME 關鍵字允許只按序號匯出,並減小結果 DLL 中匯出表的大小。但是,如果要在 DLL 上使用 GetProcAddress,則必須知道序號,因為名稱將無效。
可選的 PRIVATE 關鍵字禁止將 entryname 放到由 LINK 生成的匯入庫中。它對同樣是由 LINK 生成的影象中的匯出無效。
可選的 DATA 關鍵字指定匯出的是資料,而不是程式碼。例如,可以匯出資料變數,如下所示
EXPORTS
i DATA
當對同一匯出使用 PRIVATE 和 DATA 時,PRIVATE 必須位於 DATA 的前面。
有三種匯出定義的方法,按照建議的使用順序依次為:
原始碼中的 __declspec(dllexport) 關鍵字
.def 檔案中的 EXPORTS 語句
LINK 命令中的 /EXPORT 規範
所有這三種方法可以用在同一個程式中。LINK 在生成包含匯出的程式時還建立匯入庫,除非生成中使用了 .exp 檔案。
以下是 EXPORTS 節的示例:
EXPORTS
DllCanUnloadNow @1 PRIVATE DATA
DllWindowName = Name DATA
DllGetClassObject @4 NONAME PRIVATE
DllRegisterServer @7
DllUnregisterServer
注意,使用 .def 檔案從 DLL 中匯出變數時,不需要在變數上指定 __declspec(dllexport)。但是,在任何使用 DLL 的檔案中,仍必須在資料宣告上使用 __declspec(dllimport)。
LIBRARY [library][BASE=address]
該語句通知 LINK 建立 DLL。LINK 同時還建立匯入庫,除非生成中使用了 .exp 檔案。
library 引數指定 DLL 的名稱。也可以使用 /out 連結器選項指定 DLL 輸出名。
BASE=address 引數設定作業系統用來載入 DLL 的基址。該引數重寫 0x10000000 的預設 DLL 位置。有關基址的詳細資訊,請參閱 /BASE 選項說明。
請記住,在生成 DLL 時使用 /DLL 連結器選項。
/HEAP:reserve[,commit]
HEAPSIZE 所展示的功能與 /HEAP 連結器選項相同。
NAME [application][BASE=address]
該語句指定主輸出檔案的名稱。另一種指定輸出檔名的方法是使用 /out 連結器選項,而另一種設定基址的方法是使用 /BASE 連結器選項。如果兩種方法都指定了,則 /OUT 重寫 NAME。
如果生成 DLL,NAME 將隻影響 DLL 名。
SECTIONS
definitions
SECTIONS 語句引入了一個由一個或多個 definitions(關於專案輸出檔案各節的訪問說明符)組成的節。每個定義必須在單獨一行上。SECTIONS 關鍵字可以在第一個定義所在的同一行或前一行上。.def 檔案可以包含一個或多個 SECTIONS 語句。
該 SECTIONS 語句為影象檔案中的一節或多節設定屬性,並可用於重寫每種節型別的預設屬性。
definitions 的格式為:
.section_name specifier
此處,.section_name 為程式影象中的節名,specifier 為下列一個或多個訪問修飾符:
EXECUTE
READ
SHARED
WRITE
用空格分開修飾符名。例如:
SECTIONS
.rdata READ WRITE
SECTIONS 標記 definitions 節列表的開始位置。每個定義必須在單獨一行上。SECTIONS 關鍵字可以在第一個定義所在的同一行或前一行上。.def 檔案可以包含一個或多個 SECTIONS 語句。支援 SEGMENTS 關鍵字作為 SECTIONS 的同義詞。
Visual C++ 的早期版本支援:
section [CLASS 'classname'] specifier
出於相容性考慮,支援 CLASS 關鍵字,但忽略了它。
另一種指定節屬性的方法是使用 /SECTION 選項。
STACKSIZE reserve[,commit]
該語句設定堆疊的大小(以位元組為單位)。另一種設定堆疊的方法是使用堆疊分配 (/STACK) 選項。有關 reserve 和 commit 引數的詳細資訊,請參閱關於該選項的文件。
該選項對 DLL 無效。
STUB:filename
當用於生成虛擬裝置驅動程式 (VxD) 的模組定義檔案時,STUB 允許指定包含將在 VxD 中使用的 IMAGE_DOS_HEADER 結構(在 WINNT.H 中定義)而不是預設頭的檔名。
另一種指定 filename 的方法是使用 /STUB 連結器選項。
在模組定義檔案中,STUB 僅在生成虛擬裝置驅動程式 (VxD) 時有效。
VERSION major[.minor]
該語句通知 LINK 將一個數字放到 .exe 檔案或 DLL 的頭中。major 和 minor 引數是從 0 到 65,535 的範圍內的十進位制數。預設值為 0.0 版。
另一種指定版本號的方法是使用版本資訊 (/VERSION) 選項。
VXD filename
允許指定虛擬裝置驅動程式 (VxD) 的名稱。預設情況下,VxD 獲取與第一個物件檔案相同的名稱。
另一種指定虛擬裝置驅動程式版本的方法是使用 /VXD 連結器選項,另一種命名輸出檔案的方法是使用 /out 選項。
在模組定義檔案中,VXD 僅在生成虛擬裝置驅動程式 (VxD) 時有效。
注:對列進行編輯時可用 UltraEdit 編輯器 挺好用的
相關推薦
如何從DLL中生成LIB檔案
如何從dll檔案匯出對應的lib檔案? Visual C++ 開發工具提供了兩個命令列工具,一個是dumpbin.exe,另一個是lib.exe。利用這兩個工具即可從dll匯出其對應的lib。 1、在命令列執行: dumpb
VS生成DLL沒有生成LIB檔案的解決方法
1、在所建工程上單擊滑鼠右鍵,在彈出的右鍵選單中選擇“新增-->新建項....---->模組定義檔案”,在該模組定義檔案中寫匯出函式表,單擊確定。然後在所建工程上單擊滑鼠右鍵,選擇“屬性”選單,在彈出的屬性對話方塊中“連結器-->輸入-->模組定義
從dll生成def檔案 並生成lib檔案
在開始選單開啟Visual Studio 2015\Visual Studio Tools\Windows Desktop Command Prompts\VS2015 x86 x64 Cross Tools Command Prompt 切換到DLL所在目錄 在命令視窗輸入 cd /d "你的
dll工程中如何生成lib檔案
新建了一個dll工程,除了生成dll檔案外,你還想生成相應的lib檔案,怎麼搞? 解決辦法: 為工程新增一個def檔案即可。 注意: 新增def檔案後,預設情況下,生成的lib檔案的名字與工程名字相同; 如果你想使用自定義的lib檔名,修改def的檔案內容即可。
10. 利用vs2017中的lib.exe把def檔案生成lib檔案
1.首先找到你的vs檔案所在資料夾 2.然後找到找到lib.exe所在的位置 我的位置是在 D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26
根據DLL檔案生成LIB檔案和def檔案
首先開啟VS的命令提示符,依次輸入下面的命令(以VLC為例)dumpbin /exports "D:\Program Files\VideoLAN\VLC\libvlc.dll" > "D:\Program Files\VideoLAN\VLC\libvlc.def"e
VC 生成DLL工程不生成LIB檔案解決方案
1.請先檢視是否輸入.def檔案 右鍵工程->連結器->輸入->模組定義檔案項 填入def檔案路徑 2.第一步如果OK請檢視連結器->高階->匯入庫 該項的值為lib檔案的輸出路徑 如果為空則輸出到與DLL同徑下。
什麼情況下,VC的DLL工程只生成DLL,不生成LIB檔案
必須至少匯出一個函式或者變數或者類。 沒有匯出的話就不生成LIB。 -------------------------------------------------------- 如果LIB是靜態庫則不需要DLL 。 如果LIB是動態連結的,那麼就必須找到DLL 。 動態連結時,LIB只包含簡單的DLL匯
從總數中生成一定數量的隨機數
min 簡單的 IV 程序 sort random pri div port 最近需要一個入學選號的程序,通過Python可以快速的實現。xueWeiShu 表示學位數,baoMingShu 表示報名的總人數。 import random xueWeiShu = 100
根據.def檔案生成lib檔案
模組定義檔案是用來描述 dll 檔案的文字格式的檔案,其格式如下: LIBRARY libdll.dll ;dll 檔案的檔名 DESCRIPTION “描述資訊” ;描述資訊,此行可以不要 EXPORTS lib_add @1 ;函式描
VS中新增lib檔案,編譯出錯:LINK : fatal error LNK1104: 無法開啟檔案:×××.lib解決辦法
新增庫檔案: 在VS中右擊專案點屬性: 新增標頭檔案目錄: 配置屬性-->C/C++-->常規-->附加包含目錄 加上標頭檔案存放的目錄。 新增lib檔案: 配置屬性-->連結器-->輸入-->附加依賴項加入庫名(×××.
【GAN ZOO翻譯】StackGAN:Text to Photo-realistic Image Synthesis with Stacked GAN 使用堆疊的GAN從文字中生成照片一樣逼真的圖片
Han Zhang1, Tao Xu2, Hongsheng Li3, Shaoting Zhang4, Xiaogang Wang3, Xiaolei Huang2, Dimitris Metaxas1 1羅格斯大學 2裡海大學 3香港中文大學 4百度研究院
專案中的java檔案沒有在WEB-INF\classes中生成class檔案
1.首先確定project->Build Automatically是否勾選上: 2.然後,再進行測試,能不能進行編譯,如果還是不能,則進行手動編譯: project->clean 3.進入clean對話方塊,選擇Clean proje
C#中從伺服器中下載execl檔案到本地
<span style="font-family:FangSong_GB2312;font-size:18px;"><strong> string pat
從git中永久刪除檔案以節省空間
在使用版本管理工具的過程中我們會碰到這樣的問題:不小心把一個不該加入版本管理的檔案加進去了,有時候這個檔案很大,也許我們整個版本庫才幾百 K,但加進去這個沒用的檔案卻有好幾百M,我可不想因為這麼個破爛東西把整個版本庫整個碩大無比,以後維護備份都不方便;還有時候是不小心把一
在命令列中使用wsimport命令在MyEclipse中生成webservice檔案,無法生成,出現directory not found這種情況
錯誤原因,在命令列中輸入地址,不能帶有空格。 錯誤做法: 不要直接把空格刪了,因為路徑中帶有空格。 如果刪除了路徑,仍然找不到路徑。 正確做法: 1、在D盤(或者其他),新建一個資料夾 2、開啟MyEclipse的時候選中這個資料夾
MATLAB/C語言混編的第一步,在MATLAB R2017b中生成mex檔案
Matlab在科學計算方面的優越性使其成為科研人員的必備軟體之一,搭載了大量複雜工具箱,日益優雅的程式碼編輯器讓MATLAB R2017b徹底替代了之前的先輩版本。然而MATLAB畢竟是一個商業化的數學軟體,在大型演算法的編寫和執行上都存在諸多缺點。因此一些大神們更喜歡用C
C#WInform 從DataTable中匯出XML檔案
private bool ExportXML(string filepath) { bool flag = true; try
KEIL MDK 下為單一C檔案生成.LIB檔案以及注意事項
操作步驟: 1、右鍵點選工程,假設為a,選Add Group,假設為b,再將想生成lib的檔案加入b group,假設檔案是cc.c,必須要有cc.h。 2、右鍵依次點選其他的group,按KEIL官網資料所說的,將Options for Group->Prope
從peach原始碼生成工程檔案
編譯過程中幾個軟體 ‘msvc’ Microsoft Visual C++ (often abbreviated as MSVC or VC++) is an integrated development environment (IDE) produc