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

  1. setpath=%path%;"C:\Program Files\Microsoft Visual Studio 8\VC\bin"
  2. cmd.exe /kvcvars32.bat

2. 启动nmake.bat,进入OpenBals库的安装目录:

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

  1. dumpbin -exports libopenblas.dll>t.txt

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

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

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

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

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

8.  删除hint和RVA两列;

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

  1. LIBRARY libopenblas.dll
  2. EXPORTS
  3. CAXPY                               @         3
  4. CBBCSD                              @      3084
  5. CBDSQR                              @      2070
  6. CCOPY                               @         6
  7. CDOTC                               @         9
  8. zupgtr                              @      5014
  9. zupgtr_                             @      5015
  10. zupmtr                              @      5017
  11. zupmtr_                             @      5018

10. 将上面改造完成后的文件重命名为libopenblas.def,然后使用lib命令,生成lib文件,如下:

  1. lib /machine:i386 /def:libopenblas.def

对于64位的机器,使用:

  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,在其前面添加以下两行:

  1. LIBRARY libopenblas.dll
  2. EXPORTS

3.  根据编译器的连接错误提示,依次将无法连接的函数名加入到这个def文件中,一行一个;

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

  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文件:

  1. pexports libopenblas.dll > libopenblas.def

如果Mingw提示没有pexports命令,我们只需要使用Mingw-get安装一下即可:

  1. mingw-get install pexports
http://blog.csdn.net/giselite/article/details/32098169

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

  1. fatal error C1047: 对象或库文件“.\x64\Release\Des.obj”是使用比创建其他对象所用编译器旧的编译器创建的;请重新生成旧的对象和库

    问题描述: 在把一个32位的dll编译成64位的时候提示上面的错误 解决办法: >属性->常规->项目默认值->全程序优化  将这里的默认项 "使用链接时间代码生成& ...

  2. 让VC编译出来的程序不依赖于msvcr80.dll/msvcr90.dll/msvcr100.dll等文件

    ---转载:http://hi.baidu.com/liu_haitao/item/e2157ac3a3c32a0bc610b253 让VC编译出来的程序不依赖于msvcr80.dll/msvcr90 ...

  3. libcmt.lib(crt0dat.obj) : error LNK2005: _amsg_exit 已经在 MSVCRTD.lib(MSVCR110D.dll) 中定义

    问题描述(VC2012): 1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: 默认库"libcmt.lib"与其他库的使用冲突:请 ...

  4. csvkit---python一个牛逼到不行的csv处理库

    先吐槽一下:不管是百度还是谷歌,查来查去除了官方文档之外就没有任何可以借鉴的例子,虽然官方文档写的挺好的.但是我一直以为是在python语言的方式运行的,结果是以命令行的方式运行的,搞得我还以为这个库 ...

  5. 在已经编译安装好php7场景下,install gd库 with free-type (解决Call to undefined function imagettftext())

    在已经编译安装好php7场景下,install gd库 with free-type (解决Call to undefined function   imagettftext()) install g ...

  6. Xamarin.Android编译提示找不到mscorlib.dll.so文件

    Xamarin.Android编译提示找不到mscorlib.dll.so文件 错误信息:AOT module ‘mscorlib.dll.so’ not found: Cannot load lib ...

  7. FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑

    FFmpeg_Tutorial FFmpeg工具和sdk库的使用demo 一.使用FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑 1.基本介绍 对于每一个从事音视频技术开发的工程师,想必没 ...

  8. base.AutoScaleMode = AutoScaleMode.Font; 方法“InitializeComponent”内的代码由设计器生成,不应手动修改。请移除任何更改,然后尝试重新打开设计器”。

    http://www.taohuiduo.com 反编译后的工程文件用VS2010打开后,在打开窗体时会出现一系列错误提示: 第一种情况: “设计器无法处理第 152 行的代码: base.AutoS ...

  9. VS2010不能编译SQLServer2005的Microsoft.SQLServer.ManagedDTS.dll的解决方法

    VS2010不能编译SQLServer2005的Microsoft.SQLServer.ManagedDTS.dll是最近碰到的一个疑难杂症问题,通过查询微软社区和一些英文资料找到了解决方法,同事说之 ...

随机推荐

  1. android开发环境安装记录

    首先进入http://developer.android.com/sdk/index.html, Google提供了一个新的DeveloperTools,即:ADT Bundle,中文翻译之:ADT捆 ...

  2. HDU 1130 How Many Trees?

    裸的卡特兰数 C++#include<iostream> #include<cstdio> using namespace std; #define base 10000 #d ...

  3. 【网络协议】TCP中的四大定时器

    前言 对于每个TCP连接,TCP一般要管理4个不同的定时器:重传定时器.坚持定时器.保活定时器.2MSL定时器. 重传定时器 非常明显重传定时器是用来计算TCP报文段的超时重传时间的(至于超时重传时间 ...

  4. android中使用jni对字符串加解密实现分析

    android中使用jni对字符串加解密实现分析 近期项目有个需求.就是要对用户的敏感信息进行加密处理,比方用户的账户password,手机号等私密信息.在java中,就对字符串的加解密我们能够使用A ...

  5. SQL Server(SSIS package) call .net DLL

    There are two method to call .net DLL in SQLSERVER. The first one is to use the sql clr but it has a ...

  6. Linux新手笔记 ibus

    centos 6.4 32  笔记 一.安装gccyum install gcc    ======================================================== ...

  7. springdata+redis配置详解

    springdata设计初衷是位简化数据类型和数据的持久化存储,它并不局限是关系型数据库还是nosql数据库,都提供了简化的数据库连接,让数据获取变得更加的简单.所有这些的实现有统一的api提供. 本 ...

  8. hadoop的集群安装

    hadoop的集群安装 1.安装JDK,解压jar,配置环境变量 1.1.解压jar tar -zxvf jdk-7u79-linux-x64.tar.gz -C /opt/install //将jd ...

  9. C++之类的静态变量

    成员变量 通过对象名能够访问public成员变量 每个对象都可以有只属于自己的成员变量 成员变量不能在对象之间共享 类的静态成员 静态成员变量  存储在   全局数据区 #include<std ...

  10. debian6 更新python版本到python3.3

    1.下载python3.3安装包 #wget wget --no-cookie --no-check-certificate --header "Cookie:gpw_e24=http%3A ...