VS2010 – 根据DLL文件重建LIB文件

一般要在项目中调用第三方提供的库时,需要链接至第三方提供的DLL文件调用里面的函数,但是一般情况下我们能获取的只有头文件(.h)和动态链接库文件(.dll),而无法得到库文件(.lib),这对我们引用DLL造成很大不便:

如果想要调用DLL中的函数,单靠头文件(.h)和动态链接库文件(.dll)需要使用LoadLibrary()和FreeLibrary()加载DLL文件,并对每个函数都进行类型定义,并用GetProcAddress()对每个函数进行一一映射,在DLL中函数数量极多时,会明显增加工作量。

经过一番搜索和实践,今天终于根据DLL文件重建了LIB文件,大体步骤如下:

1. 使用Visual Studio 2010提供的dumpbin工具提取出DLL中函数名、序号信息:

假定我们在C:盘根目录有test.dll,则打开【Visual Studio 命令提示】,并输入dumpbin /exports C:\test.dll>C:\test.def将函数名、序号信息提取至C:\test.def

vs命令提示

dumpbin命令

然后我们得到了test.def文件:

dumpbin结果

打开该.def文件,内容为如下格式:

Microsoft (R) COFF/PE Dumper Version 10.00.40219.01
Copyright (C) Microsoft Corporation. All rights reserved.

Dump of file C:\test.dll

File Type: DLL

……

ordinal hint RVA name

1 0 00007??? _function_name_1@4
3 1 00007??? _function_name_2@8
4 2 00007??? _function_name_3@40
……
9 37 00007??? _function_name_n@8

Summary

……

需要做的是将“ordinal hint RVA      name”段中的ordinal、name内容提取出来并修改为标准的.def格式并保存:

LIBRARY test.dll
EXPORTS
function_name_1@4     @1
function_name_2@8     @3
function_name_3@40   @4
……
function_name_n@8     @9

之后再用Visual Studio 命令提示中的lib工具根据该.def文件生成.lib文件:

lib /def:C:\test.def

然后在c:\program files (x86)\microsoft visual studio 10.0\vc\bin下就得到了test.lib和test.exp文件,之后再在项目红引用该 test.lib即可实现DLL隐式连接了。

注:

在将test.def修改为标准.def格式时,函数名部分将下划线前缀去了,是因为实际操作时发现:头文件如果采用__declspec(dllexport)和__declspec(dllimport)进行函数声明时,如果保留.def文件中的下划线前缀,则生成的.lib文件里函数名会变成__imp___function_name_n@n样式,对比编译连接时要求的__imp__function_name_n@n样式,在__imp__后多了一个下划线,所以重建的.lib文件链接到项目中后仍然出现连接时LINK2019错误,而去掉.def文件中函数名的下划线前缀重新生成.lib文件后编译连接正常通过。
这是对比LINK2019错误信息中的函数名和重建得到的.lib文件中函数名后得出的结论,跟网上提供的步骤有所出入,不过暂时没什么依据。