我正在评估一些未记录的软件.当我构建一个示例项目时,我收到的链接器错误如下所示:
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 ...
有什么建议?
首先,您需要知道您正在查看哪种类型的库.一些库只包含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
.
这里不止一件事可能是你的问题.我不确定在lib文件中查找将是解决它的最佳方法,恕我直言......但是,DUMPBIN.exe可能是你正在寻找的工具.从命令行使用它,但请确保您的路径已设置,或使用VS在VS开始菜单中为您安装的"Visual Studio命令提示符".
如果您有一个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).
这适用于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