由.def文件生成lib文件[转]

最近在学习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

时间: 2024-10-14 05:42:56

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

在KEIL realview MDK下为单一C文件生成.LIB文件

纠结了一天,竟然没有一个网页完整的说清楚的这个问题,莫非太简单了大家不屑于说?看大多数说的都是简单地将整个工程转换成.LIB,在Project->Options for Target->Output下,选择Create Library,就可以了. 不过这样生成的lib文件巨大,我现在编译的工程最后生成的lib有2.6MB. 后来还是从KEIL官网英文资料中找到灵感(http://www.keil.com/support/docs/2610.htm): 1.右键点击工程,假设为a,选Add Gr

c++ 无法生成lib文件 的解决方案

今天生成了一个Win32->Win32 Project->Dll空文件. VS2008编译后,遇到两个问题: 1.general error c1010070: Failed to load and parse the manifest. 解决方法:添加一个空main(){}; 2. fatal error LNK1104: cannot open file '..\debug\sdk_e_x.lib' 无法生成LIB文件 解决方法: 1.添加导出方法 #define _DLL_E_X#ifd

Soy文件生成JS文件

1.下载工具包,后解压. http://closure-templates.googlecode.com/files/closure-templates-for-javascript-latest.zip 2.运行命令: java -jar SoyToJsSrcCompiler.jar --outputPathFormat helloworld.js helloworld.soy Soy文件生成JS文件

Sandcastle是微软提供的一个根据XML注释和DLL文件生成帮助文件的工具

Sandcastle是微软提供的一个根据XML注释和DLL文件生成帮助文件的工具,目前是在CodePlex上的一个开源项目,可以去这里下载:Sandcatle 项目Sandcastle 本身是一个console的程序,为了方便使用,我们可以使用他的GUI版本:Sandcastle Help File Builder. 第一步,为你写的代码添加XML注释 我们创建一个简单的ClassLibrary1项目最为示范: using System; using System.Collections.Gen

使用lib.exe生成.lib文件

当我们下载后发现只有DLL,没有LIB的时候,只能自己生成了. 以生成sqlite的lib文件为例: 在:\Program Files\Microsoft Visual Studio 8\VC\bin里面有个lib.exe用拿生成lib,但默认是不能运行的,缺少几个文件把:\Program Files\Microsoft Visual Studio 8\Common7\IDE 里面的mspdb80.dll,mspdbcore.dll,mspdbsrv.exe,msobj80.dll复制到上面的b

利用src文件得到lib文件

有时候下载的源码只有对应的makefile,没有WINDOW对应的生成办法,但是依然可以利用静态库: 1 打开vs2013新建一个win32控制台应用程序(Win32 console project ) 2 确定后,会弹出应用程序向导的提示框,点击下一步.应用程序类型选择静态库(static Library),附加选项去掉预编译头(Precomplied Header ),点击完成. 3 向工程中添加头文件(.h)与源码(.c) 4  配置项目属性,打开项目->属性->配置属性 1)在C/C+

VC++中.DLL文件与.LIB文件关系

一般的LIB文件是"导入库",用来提供给link.exe,作为链接DLL--也就是"动态链接库"的依据.里面记录了类似下面的信息:调用函数xxx(),连接到x.dll的0xABCDEFGH地址:-- 早期的LIB,是"静态链接库",也是用来提供给link.exe,作为链接代码用的.里面的记录如下:调用xxx(),其代码是--:DLL的LIB(导入库),不含可执行的具体代码(代码在DLL中).而最早的LIB(静态链接库),里面含有代码.所以,可以看

如何利用.snk文件生成DLL文件中的Publickeytoken

1.在该路径下C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin查找是否有sn.exe. 没有的话,从网上下载,注意需要的版本. 2.打开cmd命令板,进入该路径. 3.输入命令sn.exe -k 文件路径\文件名.snk,提示写入成功信息,进入路径确认是否生成指定.snk文件. PS:该文件为私钥文件 4.输入命令sn.exe -p 私钥文件 要生成公钥文件路径 5.输入命令sn.exe -tp 公钥文件路径,查看公钥和Publick

解决proto文件生成pb文件时提示(e.g."message")的问题

原因:格式不支持 解决办法:去下个notepad,打开方式选择notepad,文件属性的只读取消掉 打开后会发现最下面显示了文件的格式是unix,utf-8 右键红框处,选择转换为windows格式,会发现可以成功生成pb文件了 原文地址:https://www.cnblogs.com/lucio1128/p/12598728.html