本文基于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. 整理网站优化(SEO)的方案

    首先,我们来确定一下seo方案的定义是什么,所谓seo方案是指针对于某个网站,在完成了解熟悉的情况下,结合自身的一套seo优化方法来制定完成符合这个网站seo推广思路和策略.接下来就了解一下新手seo ...

  2. ECMAScript 5中新增的数组方法

    ECMAScript 5中定义了9个新的数组方法,用于遍历.映射.过滤.检测.简化和搜索数组. 在开始介绍之前,很有必要对这几个新增的数组方法做一个概述.首先,大多数方法的第一个参数接收一个函数,并且 ...

  3. VS2010/MFC:模态对话框及其弹出过程

    模态对话框及其弹出过程 加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有些了解了,有个好的开始对于以后的学习大有裨益.趁热打铁,这一节讲讲什么是模态对话框和非模态对话框,以及模态对话框怎 ...

  4. Android手机设置隐藏命令大全

    注意:因Android版本较多,固有部分隐藏命令或不能使用 *#*#4636#*#* 显示手机信息.电池信息.电池记录.使用统计数据.WiFi 信息 *#*#7780#*#* 重设为原厂设定,不会删除 ...

  5. 七、cocos2dx之粒子系统

    本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=66 一.介绍 粒子系统指的是一个使用大量很小的精灵或者其他的一些绘制对象模拟一些模糊效果.使用传统的 ...

  6. UIControl IOS控件编程 及UITextField的讲解

    第一部分 UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedControl分段控件.UISlider滑块.UITextField文本字段控件.UIPageCo ...

  7. Objective-c Category(类别)

    category是Objective-c里面最常用的功能之一. category可以为已经存在的类增加方法,而不需要增加一个子类. 类别接口的标准语法格式如下: #import "类名.h& ...

  8. Mybatis 简单的CRUD 基于XML文件配置

    全部的ORM框架学习曲线都是先来一个CRUD爽一爽,以下我们就来CRUD一下,全部的配置都是基于上一篇的配置.废话不多说,直接上代码. <?xml version="1.0" ...

  9. MySQL 存储过程创建表

    创建 CREATE PROCEDURE  Pro_IsExistTable(ableName varchar(100),out outputParam int)BEGINset @csql=conca ...

  10. 第10季asp.net基础

    什么是ASP.Net: ASP.Net是一种动态网页技术,在服务器端运行.Net代码,动态生成HTML.可以使用javascript.Dom在浏览器端完成很多工作,但是有很多工作无法在浏览器端完成,比 ...