1. 程式人生 > >如何從DLL中生成LIB檔案

如何從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

//為無LIBDLL製作LIB函式符號輸入庫
本文介紹了在VC中針對無LIB時的DLL隱式連結,製作可供VC++使用的LIB函式符號輸入庫。具體步驟如下:

一、使用VC++的工具DUMPBINDLL中的匯出函式表匯出到一定義(.DEF)檔案
EXAMPLE
    DUMPBIN   VideoDeCoder.dll   /EXPROTS   /OUT:VideoDeCoder.def
二、將匯出的.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   
[email protected]

                   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   建立   DLLLINK   同時還建立匯入庫,除非生成中使用了   .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。    
   
  如果生成   DLLNAME   將隻影響   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. 利用vs2017lib.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