用于检查.lib文件的工具?

时间:2009-01-28 18:42:26

标签: visual-studio

我正在评估一些未记录的软件。当我构建一个示例项目时,我收到的链接器错误如下:

error LNK2019: unresolved external symbol

这个应用程序没有很多lib文件,所以我可以通过反复试验来解决这个问题,但我知道有更多优雅的方法来解决这个问题。< / p>

在java世界中,我会 grep FOO * .jar 找到jar,我正在寻找C ++模拟。我正在使用Visual Studio 2005中的C ++代码。

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

Microsoft (R) Library Manager Version 8.00.50727.762
Copyright (C) Microsoft Corporation.  All rights reserved.

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

有什么建议吗?

5 个答案:

答案 0 :(得分:87)

首先,您需要知道您正在查看哪种类型的库。一些库仅包含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

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

答案 1 :(得分:16)

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

答案 2 :(得分:11)

如果您有一个DLL并希望在代码中使用__declspec(dllimport),那么如果您有DLL的DEF文件,则可以轻松创建所需的LIB文件:

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

创建 mydll.lib

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

如果您没有DEF文件,则可以非常轻松地手动编写: 您在 DependencyWalker http://www.dependencywalker.com)中打开DLL,选择“另存为” - &gt; “带有导入/导出列表的文本”,并在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甚至可以 undecorate 隐藏的C ++导出名称,如

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

答案 3 :(得分:8)

这适用于Visual C ++ express 9 .lib:

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

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

谢谢d.shawley

答案 4 :(得分:2)

打开Visual Studio命令提示符

dumpbin / all Effects11.lib&gt; d:\ 1.txt的