当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《用于检查.lib文件的工具?》经验,为你挑选了4个好方法。

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

error LNK2019: unresolved external symbol

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

在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
...

有什么建议?



1> D.Shawley..:

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



2> LarryF..:

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


+1"Visual Studio命令提示符"参考

3> Elmue..:

如果您有一个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 ,选择"另存为" - >"带导入/导出列表的文本"并在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). 



4> reuns..:

这适用于Visual 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

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有