• 由动态库文件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
  • 相关阅读:
    [SSRS] Use Enum values in filter expressions Dynamics 365 Finance and Operation
    Power shell deploy all SSRS report d365 FO
    display method in Dynamics 365 FO
    How To Debug Dynamics 365 Finance and Operation
    Computed columns and virtual fields in data entities Dynamics 365
    Azure DevOps for Power Platform Build Pipeline
    Create readonly entities that expose financial dimensions Dynamics 365
    Dataentity call stack dynamics 365
    Dynamics 365 FO extension
    Use singletenant servertoserver authentication PowerApps
  • 原文地址:https://www.cnblogs.com/findumars/p/5127870.html
Copyright © 2020-2023  润新知