为Dll重新构造Lib

当只有DLL和H文件而缺少LIB时,可通过dumpbin.exe生成DEF文件,然后编辑DEF文件,最后用lib.exe生成LIB。本文介绍了使用dumpbin和lib的步骤,包括环境变量设置,以gdi32.dll为例进行演示。
部署运行你感兴趣的模型镜像

有些时候, 我们手头只有*.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执行链接了.

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值