由動態庫檔案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. 在檔案的前面新增兩行,最後改造成下面這樣:
10. 將上面改造完成後的檔案重新命名為libopenblas.def,然後使用lib命令,生成lib檔案,如下:LIBRARY libopenblas.dll EXPORTS CAXPY @ 3 CBBCSD @ 3084 CBDSQR @ 2070 CCOPY @ 6 CDOTC @ 9 … … zupgtr @ 5014 zupgtr_ @ 5015 zupmtr @ 5017 zupmtr_ @ 5018
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