【Visual Studio】使用 pexports 根据 VS 的 .dll 动态链接库生成 .lib 库文件

时间:2022-05-01 15:52:03

一、问题描述:

最近博主需要使用 8 路 USB 视频采集卡做二次开发,最后选择一款叫做“中维世纪”的 8 路 USB 视频采集卡 C301。但是,官网上仅提供了 1.0.0.4 版本的 SDK,使用过程中发现,很多函数都不能用,比如:调节不了视频色彩参数,不能设置 8 路视频显示等等,但是它自带的管理软件是可以实现这些功能的。经过比对,发现它自己使用的是 1.0.0.7 的 dll,这明显就是版本更新后没有及时发布到网上!

于是博主就想用 1.0.0.7 的 dll 来进行开发,但是问题来了,它自带的 SDK 包含 1.0.0.4 的 dll、lib,1.0.0.7 只有 dll,是不能直接用的,因为函数入口地址肯定是错误的,所以有两种解决办法:

1、显式加载:直接使用 WinAPI 的 Loadlibrary 和 GetProcAddress 函数,在没有 lib 文件的情况下,直接从 dll 文件中,导出函数指针使用;

博主大概要使用 16 个以上的函数,真的好麻烦…………

2、隐式加载:最常用的 dll 使用方法,需要 dll 对应的 lib 文件,以及头文件;

因此,需要手动根据 dll 生成 lib 文件使用。

注:编译需要 .h .lib,运行需要 .dll。


二、生成步骤:

首先需要根据 dll 生成 def 文件,网上多数采用 VS 自带的 dumpbin 生成 def 文件,然后手动修改,得到标准的 def 文件的方式,手动修改很容易出错,导致最后生成的 lib 不正确,因此这里采用 pexports 生成标准的 def 文件,不需要手动改。

1、将 E:\Visual Studio 2013 Ultimate\VC\bin 添加到系统变量(具体路径选择你自己的 VS 目录,主要是为了通过 cmd 使用目录下的 lib.exe);

2、将 pexports.exe 复制到上述文件夹(主要是为了通过 cmd 使用目录下的 pexports.exe);

注:pexports-0.43.zip 下载地址:http://download.csdn.net/detail/u011408697/8465623

3、打开 cmd,切换到 dll 所在文件夹,执行命令:pexports JVSDK.dll -o > JVSDK.def,此时会生成 JVSDK.def、JVSDK.exp 两个文件;

4、以文本方式打开 JVSDK.def 可以看到:

【Visual Studio】使用 pexports 根据 VS 的 .dll 动态链接库生成 .lib 库文件

其中 @ 指的是函数序号,它与函数入口地址相关,不需要手动修改;

5、根据 def 文件,生成 lib,执行命令:lib /DEF:JVSDK.def /MACHINE:IX86 /OUT:JVSDK.lib,此时生成 lib 文件,可用在 VS 中;

6、博主使用的这个 dll,是用标准 C 写的,使用 lib 过程中,提示如下错误:

【Visual Studio】使用 pexports 根据 VS 的 .dll 动态链接库生成 .lib 库文件

说明函数没有在 lib 中找到,即 lib 文件有误,也就是说,生成的 def 文件的函数名称是错误的,所以链接时没有找到函数。

根据上图错误显示,需要在 def 文件的对应函数的末尾,加上 @ 数字,代表函数有多少字节的参数(注:前边的下划线不需要)。

7、手动修改 def 文件如下:

【Visual Studio】使用 pexports 根据 VS 的 .dll 动态链接库生成 .lib 库文件

8、重新生成 lib 文件,编译程序,通过!