zoukankan      html  css  js  c++  java
  • 由动态库文件dll生成lib库文件(手动生成.def文件,然后使用lib命令编译,非常牛),同理可使用dll生成.a库文件

    本文基于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,做如下设置:

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. setpath=%path%;"C:Program FilesMicrosoft Visual Studio 8VCin"  
    2. cmd.exe /kvcvars32.bat  
    2. 启动nmake.bat,进入OpenBals库的安装目录:

    3.  使用dumpbin导出函数列表到某个文件中:

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. dumpbin -exports libopenblas.dll>t.txt  

    4. 生成的t.txt中包含了dll文件的导出函数信息,如下:

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. Microsoft(R) COFF Binary File Dumper Version 6.00.8447  
    2. Copyright(C) Microsoft Corp 1992-1998. All rights reserved.  
    3.    
    4.    
    5. Dump of file libopenblas.dll  
    6.    
    7. File Type: DLL  
    8.    
    9.   Section contains thefollowing exports for libopenblas.dll  
    10.    
    11.            0 characteristics  
    12.     53A0ED46 time date stamp Wed Jun 1809:37:10 2014  
    13.         0.00 version  
    14.            1 ordinal base  
    15.         7417 number of functions  
    16.         7417 number of names  
    17.    
    18.     ordinal hint RVA      name  
    19.    
    20.           3   0 000012C0 CAXPY  
    21.        3084   1 00248C30 CBBCSD  
    22.        2070   2 00158A30 CBDSQR  
    23. …  
    24.        5017 1CF7 004303C0 zupmtr  
    25.        5018 1CF8 004303C0 zupmtr_  
    26.    
    27.   Summary  
    28.    
    29.         1000 .CRT  
    30.       10E000 .bss  
    31.         2000 .data  
    32.        25000 .edata  
    33.        7D000 .eh_fram  
    34.         1000 .idata  
    35.        37000 .rdata  
    36.        21000 .reloc  
    37.       80D000 .text  
    38.         1000 .tls  

    5.  将t.txt中“ordinal hintRVA      name”一行之前以及下面“Summary”之后的内容全部删除,然后使用UtriEdit等带有列编辑功能的文本编辑器打开t.txt,切换到列模式:

    6. 在最前面一列加入@(选择第一列,然后输入@即可);

    7.  将name列移动到@前面;

    8.  删除hint和RVA两列;

    9. 在文件的前面添加两行,最后改造成下面这样:

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. LIBRARY libopenblas.dll  
    2. EXPORTS  
    3.   
    4.  CAXPY                               @         3  
    5.  CBBCSD                              @      3084  
    6.  CBDSQR                              @      2070  
    7.  CCOPY                               @         6  
    8.  CDOTC                               @         9  
    9.  …  
    10.  …  
    11.  zupgtr                              @      5014  
    12.  zupgtr_                             @      5015  
    13.  zupmtr                              @      5017  
    14.  zupmtr_                             @      5018  
    10. 将上面改造完成后的文件重命名为libopenblas.def,然后使用lib命令,生成lib文件,如下:
    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. lib /machine:i386 /def:libopenblas.def  
        对于64位的机器,使用:
    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. 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,在其前面添加以下两行:

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. LIBRARY libopenblas.dll  
    2. EXPORTS  
    3.  根据编译器的连接错误提示,依次将无法连接的函数名加入到这个def文件中,一行一个;

    4.  等定义完def文件后,使用下面的命令生成.a文件:

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. 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文件:

    [plain] view plaincopy
     
    1. pexports libopenblas.dll > libopenblas.def  
    如果Mingw提示没有pexports命令,我们只需要使用Mingw-get安装一下即可:
    [plain] view plaincopy
     
    1. mingw-get install pexports  
    http://blog.csdn.net/giselite/article/details/32098169
  • 相关阅读:
    javascript动态创建Option选项
    Javascript中最常用的25个经典技巧
    C#常用函数和方法集
    C#邮件发送程序
    CSS菜单
    笔记本将有线变无线网
    svn有权限但是不能提交的原因
    IE6在https下认为iframe和about:blank不安全
    VS2008创建MFC项目提示无法找到userimages.bmp
    往数据库中插入流数据的问题
  • 原文地址:https://www.cnblogs.com/findumars/p/5127870.html
Copyright © 2011-2022 走看看