有些时候, 我们手头只有*.dll和*.h文件, 没有*.lib. 而VC链接必须要提供*.lib. 我们可以通过本文描述方法快速生成*.lib文件.
我们需要以下三步来为任意dll生成lib:
(1) 工具dumpbin.exe生成*.def文件
(2) 编辑*.def文件以满足工具lib.exe的需要
(3) 工具lib.exe生成*.lib
我们先对所涉及的工具程序dumpbin.exe和lib.exe做一简单描述:
dumpbin.exe和lib.exe随微软集成开发平台发布, 编译环境安装后在如下路径查找:
(A) VS2010: 位于安装目录下的VC/bin中. 同时需要mspdb100.dll, 该dll位于安装目录下的Common7/IDE文件夹.
例如, 我安装VS2010在D:/Program Files/Microsoft Visual Studio 10.0下, 则两者目录分别如下:
D:/Program Files/Microsoft Visual Studio 10.0/VC/bin
D:/Program Files/Microsoft Visual Studio 10.0/Common7/IDE
(B) VC++6.0: 位于安装目录下的VC98/Bin中. 同时需要mspdb60.dll, 该dll位于安装目录下的Common/MSDev98/Bin文件夹.
例如, 我安装VC++6.0在D:/Program Files/Microsoft Visual Studio下, 则两者目录分别如下:
D:/Program Files/Microsoft Visual Studio/VC98/Bin
D:/Program Files/Microsoft Visual Studio/Common/MSDev98/Bin
为了方便在路径下不带工具程序全路径, 我们需要设置环境变量. 如下:
XP-EN-SP3版本下选择MyComputer-->Properties-->Advanced-->Enviroment Variables.
如果只想对当前用户生效, 则添加在 User Variables for username. 想对全部用户生效, 则添加在System Variables项.
使用逗号分隔每一项. 例如, 我设置只对当前用户有效, 针对VS2010的更改:
D:/Program Files/IDM Computer Solutions/UltraEdit/;D:/Program Files/Microsoft Visual Studio 10.0/Common7/IDE/;D:/Program Files/Microsoft Visual Studio 10.0/VC/bin/
对于中文XP, 应该是: 我的电脑-->属性-->高级-->环境变量. 然后更改用户变量或者系统变量. 方式同英文版.
现在, 我们可以在任意目录下执行它们了, 请直接选择Start-->Run(中文为开始-->运行), 输入cmd进入命令行环境, 输入dumpbin或者lib. 如果输出找不到, 则表示上述设置有问题, 请详细检查. 如果正常, 则输出为两者的帮助信息.
我们以gdi32.dll(位于C:/WINDOWS/system32目录下)为例来说明. 选择Start-->Run, 输入cmd进入命令行环境.
1. 用工具软件dumpbin.exe生成gdi32.def
执行:
dumpbin /exports C:/WINDOWS/system32/gdi32.dll > E:/gdi32.def
进入E:盘查看, 应该有gdi32.def文件. 内容大致如下(开始和结尾部分):
完成. 按照第2步描述修改这个文件.
2. 修改gdi32.def以满足工具lib的要求
(A) 删除文件头和文件尾(用纯文本编辑器打开, 如notepad或wordpad或Editplus或者UltraEdit均可)
如下为文件头部删除的部分:
如下为文件尾部删除的部分:
如下为剩余部分(只包括剩余部分的开始和结尾部分内容):
保存更改后的文件.
(B) 函数行更改. 对于每行函数, 只保留第四列(name列).
如果只有三五行导出函数, 可能手工更改是最快的. 当导出函数数量较多时(例如gdi32.dll中有610个), 手工更改每行有些没效率, 也有些乏味. 当然, 如果工资是以小时计算的, 在心情不爽时按行删除也是一个消遣.
此处我们使用正则表达式处理, windows下本身没有支持正则的纯文本编辑器或者程序. 我们使用Editplus来完成. 如下:
Editplus官方网站是:
http://www.editplus.com/download.html
或者直接从链接下载Editplus3.12 trial:
http://www.editplus.com/ep2setup-en.cgi
如果想长期使用, 可以按照csdn资源所说进行破解, 该资源由resource_shared 发布(我们表示感谢), 链接地址为:
http://download.youkuaiyun.com/source/2435679
用Editplus打开E:/gdi32.def文件, 选择Ctrl+H或者Search-->Replace, 进行替换. 替换对话框Regular Expression前打钩(选中),
FindWhat内输入下行中括号内内部分(不含中括号), 注意, 前后均有一个空格.
[ *[0-9]+ +[0-F]+ +[0-F]* ]
Replace With输入四个空格.
选择Replace All.
我们抽点时间描述下上述正则表达式含义: 上述正则表达式匹配符合如下要求的行:
以任意空格分隔的三列.
第一列是任意个十进制数字
第二列和第三列是任意个十六进制数字
第一列前空格可以为0个或者多个
第一列和第二列之间, 第二列和第三列之间, 有1个或者多个空格
而 dumpbin 生成的.def文件内, 每个导出函数, 均由空格分隔的如下四部分构成:
[ ordinal hint RVA name ]
其中,
ordinal 是序号, 依次递加(从0开始,10进制表示)
hint 是其在Name表中的位置,依次递加(0开始,16进制表示)
RVA 是相对虚拟地址
name 是函数名称.
可见, 我们的替换操作将匹配每行的前三列, 将替换前三列为四个空格.
此时文件内容大致如下:
在文件头添加如下两行:
保存文件, 我们进入第3步
3. 用工具软件lib.exe生成gdi32.lib
执行:
lib /machine:x86 /def:E:/gdi32.def /out:E:/gdi32.lib
进入E:盘查看, 应该已经有gdi32.lib文件. 同时有gdi32.exp文件.
OK, 现在, 我们可以用lib和exp执行链接了.
当只有DLL和H文件而缺少LIB时,可通过dumpbin.exe生成DEF文件,然后编辑DEF文件,最后用lib.exe生成LIB。本文介绍了使用dumpbin和lib的步骤,包括环境变量设置,以gdi32.dll为例进行演示。
4650

被折叠的 条评论
为什么被折叠?



