本文基于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

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

  1. 由动态库文件dll生成lib库文件(手动生成.def文件,然后使用lib命令编译,非常牛),同理可使用dll生成.a库文件

    本文基于OpenBlas的编译和安装,来说明如何从一个dll文件生成lib库文件. 参考OpenBlas的说明“Howto generate import library for MingW”,和Mi ...

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

    vs2008中,有些项目上的功能是要生产库文件给其他项目调用的,以下是一些设置库文件(x.dll和x.lib)输出路径的方法. 设置x.dll 输出路径方法是在右键项目的"属性"- ...

  3. 加载dll、lib库

    2.是关于如何加载dll或lib库的.可以看这篇bog   Qt调用dll中的功能函数点击打开链接 ************************************************** ...

  4. 加载dll、lib库(例子的代码很全)

    是关于如何加载dll或lib库的.可以看这篇bog   Qt调用dll中的功能函数点击打开链接 **************************************************** ...

  5. lib静态链接库,dll动态链接库,h文件

    最近在弄摄像头,发现我在调用摄像头自带的函数的时候,库没连接上,于是经过高人指点,学习了一下lib静态链接库,dll动态链接库来补充一下自己的基础知识. 一.首先我们来介绍一下lib静态链接库. li ...

  6. 在VS工程中,添加c/c++工程中外部头文件(.h),lib库,dll库的基本步骤

    选择工程,右键-工程属性 其中: VC++目录 -->包含目录,对所有的项目及未来新建的项目都有效 c/c++-->常规-->附加包含目录,仅对当前项目有效 绝对路径设置方法: 在V ...

  7. Win32中 DLL、Lib 库的创建机器使用

    Windows 下 的静态库和动态库 一.静态函数库(Lib) 1. 静态函数库的制作(C/C++) —— 打开新建项目,然后选中Win32项目,接着在创建项目中选择 Lib,再接着将函数.实现功能的 ...

  8. 编译boost库的dll和lib

    下载Boost 下载链接:Boost Downloads 下载完成后,将其解压放置到需要编译保存的目录下,比如我自己的目录: F:\Work\Boost 打开VS编译 如果是使用的VS2017,则打开 ...

  9. windows下利用dll生成lib

    原来工程编译的一些dll库,这次项目需要静态库,偷懒想直接转化.看到网上一些教程,使用VC工具和建立lib项目来实现.有点麻烦.还有一种方法,仅仅利用工具和几条命令转化.来试试看.文章参考harrie ...

随机推荐

  1. 实现双向数据绑定mvvm

    实现双向数据绑定mvvm  

  2. Linux文件查找命令具体解释-which whereis find locate

    原创BLog.转载请注明出处 http://blog.csdn.net/hello_hwc? viewmode=contents which命令 首先查看man which的说明 which - sh ...

  3. 上传文件 nginx 413错误

    nginx : 413 Request Entity Too Large 上传文件过程发生413 Request Entity Too Large错误,翻译为请求实体过大,断定为nginx限制了请求体 ...

  4. Button的Click事件与js函数的两种不同顺序触发方式

    先运行js.或者先运行Click事件,近期就遇到了这个问题,開始弄了两个button分别运行,那才叫一个蛋疼... 1.先运行js,再运行Button的Click函数 <asp:Button I ...

  5. 使用ViewPager实现广告滑动效果

    效果图:               watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSk1DNjAx/font/5a6L5L2T/fontsize/400/ ...

  6. 使用Dagger2创建的第一个小样例

    将Dagger系列的咖啡壶样例再做一下简化,作为Dagger2的入门的第一个小样例. 场景描写叙述:有一个电水壶,它使用一个加热器来烧水.电水壶具备的功能有:開始加热(on方法),结束加热(off方法 ...

  7. bzoj3173: [Tjoi2013]最长上升子序列(树状数组+二分倒推)

    3173: [Tjoi2013]最长上升子序列 题目:传送门 题解:  好题! 怎么说吧...是应该扇死自己...看错了两次题: 每次加一个数的时候,如果当前位置有数了,是要加到那个数的前面,而不是直 ...

  8. hdoj--4857--逃生(拓扑排序+反向建图)

    逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  9. VM虚拟机上的CentOS 7系统重置root用户密码

    1.开机在进入CentOS系统时(还未进入系统内)的系统选择页面时按E键进入系统编辑模式 2.找到Linux16开头的这行代码,用方向键将光标移动至这行代码的结尾,键入一个空格和rd.break,然后 ...

  10. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...