[时间:2016-05] [状态:Open]

引言

近期由于不再使用vs生成lib,考虑使用windows下gcc生成一个动态库,供第三方调用,发现编译之后只有dll,lib如何处理?

好吧,这就是本文的目的。

由dll导出lib

Visual C++ 开发工具提供了两个命令行工具,一个是dumpbin.exe,另一个是lib.exe。利用这两个工具即可从dll导出其对应的lib。

1、导出def文件

在命令行执行:

dumpbin /exports target.dll > target.def

2、编辑target.def 文件,使之格式与.def文件格式一致 。比如:

EXPORTS
fn @1
fn @2

3、导出lib文件

在命令行执行

lib /def:target.def /machine:i386 /out:target.lib

实践

用下面的源码验证下,保存为export.c

/*
* compile with gcc 4.8.1
* gcc export.c -c -o test.exe
* gcc -Wall -shared export.c -o export.dll
*
*/ #include <stdlib.h> const char * get_version_string()
{
return "tocy-gcc-dll-test-interface";
} int select_mode(int mode)
{
return mode;
}

gcc编译后生成export.dll,执行上面的第一步,输出的def格式如下:

Microsoft (R) COFF/PE Dumper Version 10.00.40219.01
Copyright (C) Microsoft Corporation. All rights reserved. Dump of file export.dll File Type: DLL Section contains the following exports for export.dll 00000000 characteristics
5732C473 time date stamp Wed May 11 13:34:43 2016
0.00 version
1 ordinal base
2 number of functions
2 number of names ordinal hint RVA name 1 0 00001280 get_version_string
2 1 0000128A select_mode Summary 1000 .CRT
1000 .bss
1000 .data
1000 .edata
1000 .eh_fram
1000 .idata
1000 .rdata
1000 .reloc
1000 .text
1000 .tls

将其修改为标准的def文件格式,如下:

LIBRARY	export

EXPORTS
get_version_string @1
select_mode @2

执行第三步就可以导出lib。

参考资料

  1. 使用 DEF 文件从 DLL 导出
  2. Module-Definition (.Def) Files
  3. http://my.oschina.net/hondfy/blog/165675

关于dll和so的区别

windows下动态库和linux下动态库的区别。

基本机制差不多,比较奇怪的是为什么linux下的动态库*.so隐式链接的时候不需要符号表,而windows下的动态库*.dll却需要呢?

其实从文件格式上来说就知道,dll是PE格式(Portable Executable);而so是ELF格式(Executable and Linkable Format)。顾名思义,就是由于文件格式确定的。有兴趣可以深入研究下二者的不同。

如何从dll文件导出对应的lib文件?的更多相关文章

  1. 将PDM文件导出成CHM帮助文件

    实际开发中常常将维护数据库字段用 powerdesigner 维护起来,而实际要查阅 数据库用了什么字段是,常常又不方便去打开PDM 文件去找. 下面分享一个小工具,效果看下图: 有这个小工具, PD ...

  2. NPOI读取excel文件导出数据, 而此时文件正在打开中抛异常怎么办

    项目中需要用到一些数值表格, 方便起见都是用excel来的. 而如果excel正打开中, 直接使用npoi制作的工具来导出数据的话, 在这一行将会异常: workbook = new XSSFWork ...

  3. BXL文件怎样转换为AD LIB文件

    https://jingyan.baidu.com/article/48b558e326e1b17f39c09a57.html

  4. .lib文件 .h文件 .dll文件

    .lib代表的是静态数据连接库,在windows系统中起到链接程序和函数的作用,存放的是函数的是函数调用的信息,是obj文件的集合.相当于linux中的.a或.0. .so文件.lib文件是不对外公开 ...

  5. LIB文件和DLL文件的作用

    (1)lib是编译时需要的,dll是运行时需要的.如果要完成源代码的编译,有lib就够了.如果也使动态连接的程序运行起来,有dll就够了.在开发和调试阶段,当然最好都有.(2)一般的动态库程序有lib ...

  6. 关于vs的lib文件和dll文件

    一.LIB文件概念 一个lib文件是obj文件的集合.当然,其中还夹杂着其他一些辅助信息,目的是为了让编译器能够准确找到对应的obj文件 二.与DLL的区别 (1)lib是编译时需要的,dll是运行时 ...

  7. [转]静态库、动态库,dll文件、lib文件,隐式链接、显式链接

    转自:https://blog.csdn.net/dcrmg/article/details/53427181 静态链接.动态链接 静态库和动态库分别应用在静态链接方式和动态链接方式中,所谓静态链接方 ...

  8. 什么是lib文件,lib和dll的关系如何

    (1)lib是编译时需要的,dll是运行时需要的. 如果要完成源代码的编译,有lib就够了. 如果也使动态连接的程序运行起来,有dll就够了. 在开发和调试阶段,当然最好都有. (2)一般的动态库程序 ...

  9. Linux的.a、.so和.o文件 windows下obj,lib,dll,exe的关系

    Linux的.a..so和.o文件 - chlele0105的专栏 - CSDN博客 https://blog.csdn.net/chlele0105/article/details/23691147 ...

随机推荐

  1. Swift3 substring几种常用用法

    举例: " let length = str.characters.count //截取前四位 )) //截取后2位(两种方法) )) )) //截取中间4位,从第2位开始(二种方法) le ...

  2. ajax, jQuery, jQueryeasyUI

    1.ajax与jQueryajax是jquery库里面的一个被封装好的函数,可以拿来直接使用.没有jquery的话,ajax的使用就得用原生的javascript去写,比较麻烦. 2.jQuery E ...

  3. Tensorflow默认占满全部GPU的全部资源

    一台服务器上装了多块GPU,默认情况下启动一个深度学习训练任务时,这个任务会占满每一块GPU的几乎全部存储空间.这就导致一个服务器基本上只能执行一个任务,而实际上任务可能并不需要如此多的资源,这相当于 ...

  4. [Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction

    1.Spring中的数据库支持 把具有相同功能的代码模板抽取到一个工具类中.2.关于jdbc template的应用 jdbcTemplate模板操作类,把访问jdbc的模板抽取到template中, ...

  5. java的几个format

    public static String formatDateToString(long date) { SimpleDateFormat formatter = new SimpleDateForm ...

  6. 【转】25.windbg-!gle、g(错误码、g系列)

    !gle !gle 扩展显示当前线程的最后一个错误码.这个太好记了,getlasterror取首字母: <span style=:> !gle LastErrorValue: (Win32 ...

  7. 命令行修改MySQL数据库密码

    通过MySQL命令行来修改MySQL数据库的密码,下面就为您详细介绍如何使用MySQL命令行来修改密码. 格式:mysqladmin -u用户名 -p旧密码 password 新密码 1.给root加 ...

  8. 使用JMeter对网站并发性测试

    目录结构: contents structure [+] 1. 下载JMeter 2. 启动JMeter 1) 建立线程. 2) 设置请求服务器.压力链接等信息 3) 查看运行结果 3,分析数据 Ap ...

  9. win7怎么快速截取图片

    点击开始--运行或者winkey + r 键直接进入运行. 2 在输入框输入snippingtool,点击确定. 3 这就找到截图工具,如图. END 方法/步骤2   进入c盘--Windows-- ...

  10. Percona XtraBackup介绍

    Percona XtraBackup开源的.免费的mysql热备软件,可以执行无阻塞备份InnoDB和XtraDB数据库. Percona XtraBackup有以下优点: ·备份快速.可靠 ·备份期 ...