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

我正在评估一些未经证实的软件。 当我build立一个示例项目,我得到一个链接器错误,如下所示:

 错误LNK2019:无法parsing的外部符号 

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

在Java世界中,我会grep FOO * .jar来findjar,我正在寻找C ++模拟器。 我在Visual Studio 2005中使用C ++代码。

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

 Microsoft(R)Library Manager版本8.00.50727.762
版权所有(C)微软公司。 版权所有。

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

有什么build议么?

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

接下来你想使用正确的工具。 Lib.exe用于从库中提取目标文件,而不是。 这与Java的jar实用程序非常相似。 微软提供了dumpbin.exe,它会从库中转储信息。 我看到拉里夫已经提到这一点。

对于导入库,运行dumpbin.exe -headers foo.lib并将其redirect到输出文件。 输出将包含相关DLL导出的每个符号的片段。 search以" Symbol name :"开头的行。 请注意,如果您想要完全匹配,则在“符号名称”前后有两个空格。 你也可以通过findstr来运行输出来生成一个符号列表,并将其redirect到一个文本文件,如果你想要一些更好看的东西:

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

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

不止一件事可能是你的问题在这里。 我不知道看在lib文件将是解决这个问题的最好办法,恕我直言…但是,DUMPBIN.exe可能是您正在寻找的工具。 在命令行中使用它,但是确保你的path已经设置好,或者在VS开始菜单中使用VS为你安装的“Visual Studio命令提示符”。

如果你有一个DLL,并且想在你的代码中用__declspec(dllimport)来使用它,那么如果你有这个DLL的DEF文件的话,你可以很容易地创build所需的LIB文件:

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

创buildmydll.lib

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

如果你没有一个DEF文件,你可以手动编写一个DEF文件:在DependencyWalkerhttp://www.dependencywalker.com )中打开DLL,select“另存为” – >“带有导入/导出列表的文本”并将所有导出的函数的名称序号放在一个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 

其余的很快就完成了。 创build一个具有以下格式的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). 

这工作与一个视觉C ++ express 9 .lib:

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

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

谢谢d.shawley

打开Visual Studio命令提示符

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