从 DLL 文件生成 LIB 文件
标题可能有一定误导嫌疑,首先这里的 lib 文件不是指静态编译的 lib 文件,而是和 dll 配套使用的用来通过链接的 lib 文件;另外也不是从 dll 生成,而是直接生成,只是需要先通过 dll 来查看有哪些导出函数。
故事背景
在做酷 Q 插件开发的时候,发现官方的 C++ SDK 很久没有更新了,找了一圈发现其实它的函数实现都在安装目录的 CQP.dll
,我要做的就是能让 C++ 代码去调用里面的函数,根据官方 SDK 的结构,光使用头文件来声明是没有用的,还需要一个 .lib
文件,研究了一圈发现其实 SDK 所谓的 .lib
文件并不是真正的函数实现,而只是用来通过编译的一个东西,它内部实际上是对 dll 中的函数的一些描述。于是就有了后面的折腾。
方法和坑……
需要说明的是,这里主要说的是针对酷 Q 的 dll 的情况,似乎编译 dll 的时候,函数的修饰符会影响很多结果,我也不太清楚酷 Q 具体是怎么修饰的导出函数,所以,这里说的方法可能不具有普适性。
我本来以为那个 .lib
文件是把 dll 转换成静态编译的,但似乎这其实是做不到的(或者我没找到办法),然后发现只是一个对 dll 里函数的描述,于是找到了生成 lib 文件的办法。
获取 DLL 文件的导出函数列表
首先需要知道代码里面会调用那些函数的函数名称和参数列表,这也就需要知道 dll 里面有哪些函数。打开 VS 附带的一个「Visual Studio Developer Command Prompt」(可以在开始菜单搜索到),然后进入 dll 文件所在目录,运行 dumpbin.exe /exports Some.dll > dump
即可把导出函数等一堆信息 dump 到 dump
文件中,类似下面这样:
Microsoft (R) COFF/PE Dumper Version 14.10.25019.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file .\CQP.dll
File Type: DLL
Section contains the following exports for CQP.dll
00000000 characteristics
590B3029 time date stamp Thu May 4 21:44:09 2017
0.00 version
1 ordinal base
36 number of functions
36 number of names
ordinal hint RVA name
1 0 0006F0D2 CQ_addLog
2 1 0006F1D2 CQ_getAppDirectory
3 2 0006F12C CQ_getCookies
4 3 0006F160 CQ_getCsrfToken
......
从这里就可以知道 dll 的导出函数有哪些,不过只有函数名,我这里遇到的情况,还需要知道参数列表(准确地说是参数列表所占用的字节数)。
……
从 DLL 文件生成 LIB 文件