由动态库文件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. 在文件的前面加入两行,最后改造成以下这样:

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
时间: 2024-11-04 11:02:09

由动态库文件dll生成lib库文件的相关文章

vc下DLL项目设置dll和lib库输出路径以及使用lib/dll库时的包含路径

include 头文件包含路径设置: project->setting->C/C++->常规: Additional include directories(附加包含目录): ../../include等等 链接文件输出目录:    project->setting->配置属性->常规:输出目录 例如:输出目录:$(SolutionDir)Temp\Link\$(ProjectName)\$(ConfigurationName) 解释:项目目录-Temp-Link-工程

vs2008设置dll、lib库的输出路径

vs2008中,有些项目上的功能是要生产库文件给其他项目调用的,以下是一些设置库文件(x.dll和x.lib)输出路径的方法. 设置x.dll 输出路径方法是在右键项目的"属性"->连接器->常规, 然后在常规属性界面中的 "输出文件" 中填入自己想要x.dll文件的输出路径. 设置x.lib 输出路径方法是在右键项目的"属性"->连接器->高级, 然后在高级属性界面中的 "导入库" 项中填入自己想要x

加载dll、lib库

2.是关于如何加载dll或lib库的.可以看这篇bog   Qt调用dll中的功能函数点击打开链接 **************************************************************************************************************************************************** 声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的.并且用我前两篇有

golang 标准库io/ioutil,读取文件,生成临时目录/文件

1.读取目录 list, err := ioutil.ReadDir("DIR")//要读取的目录地址DIR,得到列表 if err != nil { fmt.Println("read dir error") return } for _, info := range list { //遍历目录下的内容,获取文件详情,同os.Stat(filename)获取的信息 info.Name()//文件名 info.Mode()//文件权限 info.Size()//文件

[文件操作 生成20个文件:每个包含100字节的随机数]

Objective-C: -(void)create{ for (int i=0; i<20;i++) { NSString *fp = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/%i.txt",i]]; NSString *ss= @""; for(int i=0;i<100;i++){ int value = arc

Makefile学习(二)----生成静态库文件

Lunix下编译静态库文件: .o后缀文件:编译生成的中间代码文件: .a后缀文件:静态库文件,编译的时候会合到可执行程序中,文件比较大: .so后缀文件:动态库文件,只是一个指向,不会合到可执行程序中,当要调用函数库的时候才使用: 用一个简单的例子阐述下在lunix环境下生成静态库文件的过程: 一.   源码文件: so_test.h: void test_a(); void test_b(); void test_c(); test_a.c: #include "so_test.h"

vs2015 引用lib库和dll

1.首先右键项目->属性 2.在项目中添加lib文件夹,把lib库放在文件夹下面,然后在图中的库目录引用当前路径的lib文件夹 3.在项目的路径下添加include中添加头文件,然后在常规中添加附加包含目录 4.在链接器->输入->附加依赖项添加具体的lib库 5.最后把dll放在项目的路径下即可

记录一次安卓动态调试lib库

这道题是iscc 2017中的安卓第二题,所有的算法都在lib库中,而lib库又是加了壳的,所以就用动态调试解决吧.第一次动态调试安卓,就写的详细一些吧. 文中用到 1.能正常运行这个crackme的手机一部,需要root(本人手上的主力机是安卓7.1的就运行不了)2.IDA一个3.IDA神级插件Keypatch4.安卓调试adb5.python6.这个crackme 题目链接 链接:http://pan.baidu.com/s/1kVLYYOJ 密码:e2tj 解析 准备 首先在手机上安装这个

由.def文件生成lib文件[转]

最近在学习curl库时,碰到一个问题,从官网上下载了一个lib版的,却发现只有.dll,没有lib文件,感觉很奇怪,google了之后才知道,原来库作者的用意是让用户自己生成lib文件,下载到的lib文件中含有.def文件.唉,用了vs有几个年头了,却连这么基础的问题都不知道,编译器是变得越来越智能了,只是让我们变得越来越傻了.下边我总结了一下由.def生成lib的方法. 在使用 VC 链接 dll 时,通常需要一个导入库文件(.lib),但有时我们只有一个 dll 文件,怎么办呢? 通常,在链