检查.lib 文件的工具?

我正在评估一些没有文档的软件。当我构建一个示例项目时,我得到一个链接器错误,看起来像:

error LNK2019: unresolved external symbol

There aren't a whole lot of lib files with this app, so I can solve this problem with trial and error, but I know there's a more elegant way is to solve this problem.

In the java world, I would grep FOO *.jar to find the jar and I'm looking for the C++ analog. I'm working with C++ code in Visual Studio 2005.

I suspect the lib.exe utility with the /LIST option can get the information, but I've been unsuccessful so far. It just prints this:

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


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

有什么建议吗?

83971 次浏览

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

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

接下来,您需要使用正确的工具。Exe 用于从库中提取目标文件等等。这与 Java 的 jar 实用程序非常相似。Microsoft 提供了 Dumpbin.exe,它将从库中转储信息。我看到 赖瑞已经提到了这一点。

对于导入库,运行 dumpbin.exe -headers foo.lib并将其重定向到输出文件。输出将包含相关 DLL 导出的每个符号的代码段。搜索以 " Symbol name :"开头的行。请注意,如果您想要精确匹配,“符号名称”之前和之后有两个空格。您还可以通过 findstr运行输出,以生成一个符号列表,并将其重定向到一个文本文件,如果您希望看起来更美观一些的话:

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

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

这与可视化的 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

如果你有一个 DLL,并希望在 __declspec(dllimport)代码中使用它,你可以很容易地创建所需的 LIB 文件,如果你有一个 DEF 文件的 DLL:

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

创造了 Mydll.lib

此命令应在 VisualStudioSDK 命令提示符中运行。

如果没有 DEF 文件,可以非常容易地手动编写: 在 依赖 Walker(http://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

@ 后面的数字是序数。


警察: DependencyWalker 甚至可以使用 不要装饰这样的 C + + 导出的神秘名称

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

打开 VisualStudio 命令提示符

Dumpbin/all Effects11.lib > D: 1. txt 垃圾箱/所有效果11.lib > D: 1. txt