最近在学习curl库时,碰到一个问题,从官网上下载了一个lib版的,却发现只有.dll,没有lib文件,感觉很奇怪,google了之后才知道,原来库作者的用意是让用户自己生成lib文件,下载到的lib文件中含有.def文件。唉,用了vs有几个年头了,却连这么基础的问题都不知道,编译器是变得越来越智能了,只是让我们变得越来越傻了。下边我总结了一下由.def生成lib的方法。

在使用 VC 链接 dll 时,通常需要一个导入库文件(.lib),但有时我们只有一个 dll 文件,怎么办呢?

通常,在链接库文件时,需要一个 (.lib)文件,lib 文件分为两种:一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。VC 在链接 dll 时,需要根据导入库(.lib)来定位 dll 中的符号位置。没有这个文件,VC 链接器将不能正常链接。

解决此问题的办法有三个:

  1. 使用 DLL to Lib 工具,根据 dll 文件生成 lib 文件。
  2. 使用 LoadLibrary 函数加载 dll 文件,再使用 GetProcAddress 来查找函数地址,根据得到的函数指针来进行调用。
  3. 编写模块定义文件(.def),使用命令行生成 lib 文件。

以下重点介绍使用模块定义文件来生成 lib 的方法。

模块定义文件是用来描述 dll 文件的文本格式的文件,其格式如下:

LIBRARY libdll.dll      ;dll 文件的文件名
DESCRIPTION "描述信息"  ;描述信息,此行可以不要
EXPORTS
lib_add @1        ;函数描述
lib_sub @2        ;函数描述

第一行:在 LIBRARY 后面填 dll 文件的名字,分号后面是注释。

第二行:DESCRIPTION,描述信息,此行可以忽略

第三行:EXPORTS

第四行开始,是 dll 文件中函数的描述,可以使用 dumpbin /EXPORTS libdll.dll 命令查看,(其中,libdll.dll 是目标 dll 的文件路径)

以上文件写好后,保存成 libdll.def 文件,放在和 dll 文件相同的目录。

使用 lib /def:libdll.def 命令,可以生成 lib 文件。

来源: http://blog.csdn.net/windows_nt/article/details/9708101

由.def文件生成lib文件[转]的更多相关文章

  1. 从动态库的def文件生成lib文件

    以sqlite3为例,下载的文件中只有def文件,没有lib文件,想使用静态方式调用dll的情况下,就需要额外的.h文件和.lib文件存在. .h文件可以从官方下载的sqlite-amalgamati ...

  2. Keil MDK中单个c文件生成LIB文件

    看大多数说的都是简单地将整个工程转换成.LIB,在Project->Options for Target->Output下,选择Create Library,就可以了. 不过这样生成的li ...

  3. 工程没有生成lib文件,只生成了dll文件

    解决办法: 在工程上右键 -> 添加 -> 新建项 -> 选"模块定义文件(.def)" -> 随便填写个名字 -> 添加 重新编译编译就可生成.li ...

  4. VS2017生成一个简单的DLL文件 和 LIB文件——C语言

    下面我们将用两种不同的姿势来用VS2017生成dll文件(动态库文件)和lib文件(静态库文件),这里以C语言为例,用最简单的例子,来让读者了解如何生成dll文件(动态库文件) 生成动态库文件 姿势一 ...

  5. ffmpeg文件生成m3u8文件及ts切片程序(一)

    ffmpeg文件生成m3u8文件及ts切片程序(一) 实现目标:输入本地文件,实现m3u8切片,功能点请看注释,注意:注释很重要. 参考: http://www.cnblogs.com/mystory ...

  6. ActiveX: 如何用.inf和.ocx文件生成cab文件

    ActiveX: 如何用.inf和.ocx文件生成cab文件  

  7. LINQ to XML 从逗号分隔值 (CSV) 文件生成 XML 文件

    参考:http://msdn.microsoft.com/zh-cn/library/bb387090.aspx 本示例演示如何使用 语言集成查询 (LINQ) 和 LINQ to XML 从逗号分隔 ...

  8. pyx文件 生成pyd 文件用于 cython调用

    转于:https://www.2cto.com/kf/201405/304168.html 1. 初衷 最近学用python,python不愧是为程序员考虑的编程语言,写起来很快很方便,大大节省开发效 ...

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

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

随机推荐

  1. getElementsByName属性

    getElementsByName() 方法可返回带有指定名称的对象的集合 语法 document.getElementsByName(name) 该方法与 getElementById() 方法相似 ...

  2. Java 基础(1)—— 开始前的准备

    虽然学习 Java 已有一年多,但是从来没有仔细总结或者复习过.于是准备借用博客来进行一波学习记录.从头开始,学习 Java. Java 介绍 生产公司:Sun Microsystems 公司(200 ...

  3. Light OJ 1422 - Halloween Costumes(区间DP 最少穿几件)

    http://www.cnblogs.com/kuangbin/archive/2013/04/29/3051392.html http://www.cnblogs.com/ziyi--caolu/a ...

  4. Python 2.x版本和Python3.x版本的不同

    在新的Python版本中,Python3.x虽然在主要的核心语言和模块等方面没有打的改变,但是Python3.x与2.x还是有很大区别的.而且Python3.x与2.x并不兼容. 比如说HTTPSer ...

  5. thinkphp注册并写入数据到数据库中

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. ajax提交手机号去数据库验证并返回状态值

    <script type="text/javascript"> $(function(){ $('.agree_regi').click(function(){ var ...

  7. div中嵌套div中使用margin-top失效问题

    div中嵌套div中使用margin-top失效问题

  8. php从身份证获取性别和出生年月

    //通过身份证号查询出性别与生日 $birth = strlen($idcard)==15 ? ('19' . substr($idcard, 6, 6)) : substr($idcard, 6, ...

  9. 从Pc转向H5开发遇到的适配问题思考

    1.首先说滚动条 移动端开发在不设置任何适配和viewport宽度的情况下,以iphone5为例:屏幕界面的逻辑分辨率是320x568,在谷歌浏览器的界面下屏幕的可视宽度是980px(谷歌设置的,每个 ...

  10. Hibernate 注解(Annotations 二)一对一双向注解

    注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来 ...