由动态库文件dll生成lib库文件(手动生成.def文件,然后使用lib命令编译,非常牛),同理可使用dll生成.a库文件
本文基于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
- http://blog.csdn.net/giselite/article/details/32098169
由动态库文件dll生成lib库文件(手动生成.def文件,然后使用lib命令编译,非常牛),同理可使用dll生成.a库文件的更多相关文章
- fatal error C1047: 对象或库文件“.\x64\Release\Des.obj”是使用比创建其他对象所用编译器旧的编译器创建的;请重新生成旧的对象和库
问题描述: 在把一个32位的dll编译成64位的时候提示上面的错误 解决办法: >属性->常规->项目默认值->全程序优化 将这里的默认项 "使用链接时间代码生成& ...
- 让VC编译出来的程序不依赖于msvcr80.dll/msvcr90.dll/msvcr100.dll等文件
---转载:http://hi.baidu.com/liu_haitao/item/e2157ac3a3c32a0bc610b253 让VC编译出来的程序不依赖于msvcr80.dll/msvcr90 ...
- libcmt.lib(crt0dat.obj) : error LNK2005: _amsg_exit 已经在 MSVCRTD.lib(MSVCR110D.dll) 中定义
问题描述(VC2012): 1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: 默认库"libcmt.lib"与其他库的使用冲突:请 ...
- csvkit---python一个牛逼到不行的csv处理库
先吐槽一下:不管是百度还是谷歌,查来查去除了官方文档之外就没有任何可以借鉴的例子,虽然官方文档写的挺好的.但是我一直以为是在python语言的方式运行的,结果是以命令行的方式运行的,搞得我还以为这个库 ...
- 在已经编译安装好php7场景下,install gd库 with free-type (解决Call to undefined function imagettftext())
在已经编译安装好php7场景下,install gd库 with free-type (解决Call to undefined function imagettftext()) install g ...
- Xamarin.Android编译提示找不到mscorlib.dll.so文件
Xamarin.Android编译提示找不到mscorlib.dll.so文件 错误信息:AOT module ‘mscorlib.dll.so’ not found: Cannot load lib ...
- FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑
FFmpeg_Tutorial FFmpeg工具和sdk库的使用demo 一.使用FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑 1.基本介绍 对于每一个从事音视频技术开发的工程师,想必没 ...
- base.AutoScaleMode = AutoScaleMode.Font; 方法“InitializeComponent”内的代码由设计器生成,不应手动修改。请移除任何更改,然后尝试重新打开设计器”。
http://www.taohuiduo.com 反编译后的工程文件用VS2010打开后,在打开窗体时会出现一系列错误提示: 第一种情况: “设计器无法处理第 152 行的代码: base.AutoS ...
- VS2010不能编译SQLServer2005的Microsoft.SQLServer.ManagedDTS.dll的解决方法
VS2010不能编译SQLServer2005的Microsoft.SQLServer.ManagedDTS.dll是最近碰到的一个疑难杂症问题,通过查询微软社区和一些英文资料找到了解决方法,同事说之 ...
随机推荐
- Aone新拉分支
1.进入Aone新建项目 2.测试人员填huyangjun和husong 3.进入后拉分支 4.弄个日常普通环境 5.吧环境跑起,绑定Host就可以
- DBCC CHECKDB用法 手工修复数据库
快速修复 DBCC CHECKDB ('数据库名', REPAIR_FAST) 重建索引并修复 DBCC CHECKDB ('数据库名', REPAIR_REBUILD) 如果必 ...
- QQ聊天原理初识
1:qq之间文件的传输是通过p2p通信进行的. 2:qq之间的表情发送实际上就是文字的发送,是client再接受到文字之后在本地自己进行转换 3:qq之间的通信既能够通过udp也能够通过Tcp 尽管u ...
- adb shell dumpsys 命令 查看内存
android程序内存被分为2部分:native和dalvik,dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是 n ...
- 使用线程 在shell上同步动态显示当前系统时间
//创建一个用于刷新当前系统时间的线程 new Thread() { public void run() { // 此处为另外一个单独线程,非UI线程 Display dis=shell.getDis ...
- MVC日期比较(转)
/// <summary> /// Specifies that the field must compare favourably with the named field, ...
- <input type="text">文本输人框
type类型: text 文本框 password 口令密码输人框 reset 重置或清除 buttou 命令按钮 checkbox 复选框 radio 单选框 submit 提交 fi ...
- 文件下载 .net
protected void Button1_Click(object sender, EventArgs e) { /* 微软为Response对象提供了一个新的方法TransmitFile来解决 ...
- JavaSE学习总结第10天_面向对象5
10.01 运动员和教练案例分析 教练和运动员案例:运动员分乒乓球运动员和篮球运动员,教练分乒乓球教练和篮球教练.为了出国交流,跟乒乓球相关的人员都需要学习英语. 分析: 10.02 运动员和教练 ...
- [条款36]绝不重新定义继承而来的non-virtual函数
看下面的两个类的声明代码: class B { public: void mf(); //something to do }; class D : public B { public: void mf ...