我正在评估一些未记录的软件。当我构建一个示例项目时,我收到的链接器错误如下:
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 ...
有什么建议吗?
答案 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的