zoukankan      html  css  js  c++  java
  • 由动态库文件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 FilesMicrosoft Visual Studio 8VCin"
        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


  • 相关阅读:
    Java系列教程-Spring 教程目录
    python中如何给散点图上面的特定点做标记
    OpenCV:Python下OpenCV安装和入门最强详细攻略
    如何实现一个 windows 桌面动态壁纸
    学习C/C++的简单方法
    手眼标定
    python合并多个txt文件
    python qq发消息
    python获取当前天气情况
    程序代写、毕业设计
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7055976.html
Copyright © 2011-2022 走看看