首页 > 代码库 > 由动态库文件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.bat2. 启动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_ @ 501810. 将上面改造完成后的文件重命名为libopenblas.def,然后使用lib命令,生成lib文件,如下:
lib /machine:i386 /def:libopenblas.def对于64位的机器,使用:
lib /machine:X64 /def:libopenblas.def11. 至此,我们需要的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 EXPORTS3. 根据编译器的连接错误提示,依次将无法连接的函数名加入到这个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