1. 程式人生 > >由動態庫檔案dll生成lib庫檔案

由動態庫檔案dll生成lib庫檔案

本文基於OpenBlas的編譯和安裝,來說明如何從一個dll檔案生成lib庫檔案。

參考OpenBlas的說明“Howto generate import library for MingW”,和MinGW的說明HOWTO Create an ImportLibrary for a DLL using MinGW,學習如何生成lib庫,其中OpenBlas的說明講的是如何使用Visual studio的lib.exe工具從dll生成lib檔案,而MinGW講的是如何把一個windows的dll轉變成MinGW可以使用的.a型的lib庫。使用Visual studio的工具,從dll生成lib檔案的具體步驟如下:

1. 編寫bat批處理檔案nmake.bat,做如下設定:

    setpath=%path%;"C:\Program Files\Microsoft Visual Studio 8\VC\bin"
    cmd.exe /kvcvars32.bat
2. 啟動nmake.bat,進入OpenBals庫的安裝目錄:


3.  使用dumpbin匯出函式列表到某個檔案中:

    dumpbin -exports libopenblas.dll>t.txt

4. 生成的t.txt中包含了dll檔案的匯出函式資訊,如下:

Microsoft(R) COFF Binary File Dumper Version 6.00.8447
Copyright(C) Microsoft Corp 1992-1998. All rights reserved.
 
 
Dump of file libopenblas.dll
 
File Type: DLL
 
  Section contains thefollowing exports for libopenblas.dll
 
           0 characteristics
    53A0ED46 time date stamp Wed Jun 1809:37:10 2014
        0.00 version
           1 ordinal base
        7417 number of functions
        7417 number of names
 
    ordinal hint RVA      name
 
          3   0 000012C0 CAXPY
       3084   1 00248C30 CBBCSD
       2070   2 00158A30 CBDSQR
…
       5017 1CF7 004303C0 zupmtr
       5018 1CF8 004303C0 zupmtr_
 
  Summary
 
        1000 .CRT
      10E000 .bss
        2000 .data
       25000 .edata
       7D000 .eh_fram
        1000 .idata
       37000 .rdata
       21000 .reloc
      80D000 .text
        1000 .tls

5.  將t.txt中“ordinal hintRVA      name”一行之前以及下面“Summary”之後的內容全部刪除,然後使用UtriEdit等帶有列編輯功能的文字編輯器開啟t.txt,切換到列模式:

6. 在最前面一列加入@(選擇第一列,然後輸入@即可);

7.  將name列移動到@前面;

8.  刪除hint和RVA兩列;

9. 在檔案的前面新增兩行,最後改造成下面這樣:

LIBRARY libopenblas.dll
EXPORTS

 CAXPY                               @         3
 CBBCSD                              @      3084
 CBDSQR                              @      2070
 CCOPY                               @         6
 CDOTC                               @         9
 …
 …
 zupgtr                              @      5014
 zupgtr_                             @      5015
 zupmtr                              @      5017
 zupmtr_                             @      5018
10. 將上面改造完成後的檔案重新命名為libopenblas.def,然後使用lib命令,生成lib檔案,如下:
       lib /machine:i386 /def:libopenblas.def
    對於64位的機器,使用:
      lib /machine:X64 /def:libopenblas.def
11. 至此,我們需要的lib庫檔案生成了,我們只需要在Visualstudio的包含目錄裡新增OpenBlas的include目錄,在lib目錄裡包含lib庫的目錄,並且把libopenblas.lib加入到附加依賴項裡就可以使用OpenBlas庫了。

至於MinGW的幫助HOWTO Create an ImportLibrary for a DLL using MinGW講的是我們在擁有dll檔案的時候,如何生成MinGW可以使用的字尾為.a的lib庫的步驟,這裡假定我們至於libopenblas.dll,沒有libopenblas.a,我們要生成libopenblas.a基本步驟如下:

1.  在mysys shell裡,切換到dll檔案所在目錄;

2.  新建文字檔案,命令為libopenblas.def,在其前面新增以下兩行:

LIBRARY libopenblas.dll
EXPORTS
3.  根據編譯器的連線錯誤提示,依次將無法連線的函式名加入到這個def檔案中,一行一個;

4.  等定義完def檔案後,使用下面的命令生成.a檔案:

libtool –d libopenblas.def –l libopenblas.a

命令執行完畢後,生成的libopenblas.a檔案就是MinGW的lib庫檔案。

這個說明中的第3步完全是基於MinGW的視角來看的,在Windows下,我們可以使用Visual studio的bumpbin來完成這個步驟,也就是前面講的如何生成def檔案的步驟。

另外Mingw實際上提供了一個工具用於完成這個事情,只是在HOWTO Create an ImportLibrary for a DLL using MinGW一文中他們自己都沒有說清楚,對於libopenblass.dll,在MinGW下使用下面的命令生成def檔案:

pexports libopenblas.dll > libopenblas.def
如果Mingw提示沒有pexports命令,我們只需要使用Mingw-get安裝一下即可:
mingw-get install pexports