检查.lib文件的工具?


72

我正在评估一些文档不足的软件。当我构建示例项目时,出现类似以下的链接器错误:

错误LNK2019:无法解析的外部符号

这个应用程序没有很多lib文件,因此我可以通过反复试验解决此问题,但是我知道还有一种更优雅的方法是解决此问题。

在Java世界中,我将grep FOO * .jar查找jar,然后在寻找C ++类似物。我正在Visual Studio 2005中使用C ++代码。

我怀疑带有/ LIST选项的lib.exe实用程序可以获取信息,但是到目前为止,我一直没有成功。它只是打印此:

Microsoft(R)库管理器版本8.00.50727.762
版权所有(C)Microsoft Corporation。版权所有。

granite50.dll
granite50.dll
granite50.dll
granite50.dll
...

有什么建议?

Answers:


91

首先,您需要知道要查看的库类型。一些库仅包含DLL的链接(即导入库),而另一些则是成为可执行映像一部分的代码对象(即静态库)。从输出的外观来看,您正在查看一个DLL导入库。

接下来,您想使用正确的工具。Lib.exe用于从库中提取对象文件,而不是。这与Java的jar实用程序几乎相同。Microsoft提供了dumpbin.exe,它将从库中转储信息。我看到LarryF已经提到了这一点。

对于导入库,请运行dumpbin.exe -headers foo.lib并将其重定向到输出文件。输出将包含相关DLL导出的每个符号的摘要。搜索以开头的行" Symbol name :"。请注意,如果要完全匹配,则在“符号名称”之前和之后有两个空格。您还可以运行输出findstr以生成符号列表,并将其重定向到文本文件(如果您希望更好看的话):

dumpbin.exe -headers foo.lib | findstr /c:"  Symbol name  :" > foo-exports.txt

另一个选择是使用打开打开相关的DLL depends.exe


1
对于有困难的人跑dumpbin.exePowershell- stackoverflow.com/questions/477387/cannot-find-dumpbin-exe/...
RALT

能够从VS命令提示符运行此程序而不会出现问题。
深度元素

16

在这里,不止一件事可能是您的问题。我不确定在lib文件中查找是否是解决该问题的最佳方法,恕我直言...但是,DUMPBIN.exe可能是您正在寻找的工具。从命令行使用它,但请确保已设置路径,或使用VS在VS开始菜单中为您安装的“ Visual Studio命令提示符”。


感谢您指向dumpbin的指针。我做了<b> dumpbin / all some.lib> some.dump </ b>,然后grep浏览了我的转储文件,找到了我需要链接的库。
criddell

11

如果您有一个DLL并想在您的代码中使用它,并且您有一个DLL__declspec(dllimport)的DEF文件,则可以轻松地创建所需的LIB文件:

lib /def:mydll.def /nologo /machine:x86  

创建mydll.lib

该命令应在Visual Studio SDK命令提示符中运行。

如果您没有DEF文件,则可以非常容易地手动编写它:在DependencyWalkerhttp://www.dependencywalker.com)中打开DLL ,选择“另存为”->“带有导入/导出列表的文本”并在txt文件中包含所有导出函数的名称序号,如下所示:

Export  Ordinal      Hint         Function                          Entry Point
------  -----------  -----------  --------------------------------  -----------
[C  ]    2 (0x0002)   1 (0x0001)  gsasl_base64_from                 0x000024F0
[C  ]    3 (0x0003)   2 (0x0002)  gsasl_base64_to                   0x000024A0
[C  ]    4 (0x0004)   3 (0x0003)  gsasl_callback                    0x000018B0
[C  ]    5 (0x0005)   4 (0x0004)  gsasl_callback_hook_get           0x00001900
[C  ]    6 (0x0006)   5 (0x0005)  gsasl_callback_hook_set           0x000018F0
[C  ]    7 (0x0007)   6 (0x0006)  gsasl_callback_set                0x000018A0
[C  ]    8 (0x0008)   7 (0x0007)  gsasl_check_version               0x00001870
[C  ]    9 (0x0009)   8 (0x0008)  gsasl_client_mechlist             0x00001E20
[C  ]   10 (0x000A)   9 (0x0009)  gsasl_client_start                0x00001F40

其余的很快完成。创建具有以下格式的DEF文件

EXPORTS
gsasl_base64_from @2
gsasl_base64_to @3
gsasl_callback @4
gsasl_callback_hook_get @5
gsasl_callback_hook_set @6
gsasl_callback_set @7
gsasl_check_version @8
gsasl_client_mechlist @9
gsasl_client_start @10
gsasl_client_suggest_mechanism @11

@后面的数字是序数。


PD:DependencyWalker甚至可以取消修饰C ++导出的加密名称,例如

Foo@@YGHHH@Z   -->   int Foo(int, int). 

顺便说一句,由于ABI的更改,这在x64下不再起作用。
0xC0000022L18年

8

这与可视C ++ Express 9 .lib一起使用:

dumpbin.exe -headers clangParse.lib | findstr / c:“ COMDAT”> clangParse-exports.txt

或dumpbin.exe -headers clangParse.lib | findstr / c:“ sym =”> clangParse-exports.txt

谢谢d.shawley


2

打开Visual Studio命令提示符

dumpbin / all Effects11.lib> D:\ 1.txt

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.