继我之前关于调试本机代码的问题之后,我决定从控制台应用程序创建一个简单的测试,因为我无法直接调试服务。
所以我创建了一个 vc6 控制台应用程序,将 dll 项目添加到工作区并运行它。
它没有按预期执行,而是吐出以下链接器错误:
main.obj : error LNK2001: unresolved external symbol "int __stdcall hmDocumentLAdd(char *,char *,long,char *,char *,long,long,long,long *)" (?hmDocumentLAdd@@YGHPAD0J00JJJPAJ@Z)
main.obj : error LNK2001: unresolved external symbol "int __stdcall hmGetDocBasePath(char *,long)" (?hmGetDocBasePath@@YGHPADJ@Z)
Debug/HazManTest.exe : fatal error LNK1120: 2 unresolved externals
这似乎是在链接器选项中忘记某些内容的简单情况:但是一切似乎都很正常,并且 lib 文件、dll 和源代码可用。如果我将 lib 文件更改为无意义的加载,它会启动fatal error LNK1104: cannot open file "asdf.lib"
,所以这不是问题。
我之前已经链接到 dll 并且它们刚刚工作,所以我忘了做什么?
更新:根据此线程,我查看是否可以找到任何其他信息。这就是 VS2005 的垃圾箱给我的。
> dumpbin /linkermember Hazardman.lib | findstr "DocumentLAdd"
F6DC __imp__hmDocumentLAdd@36
F6DC _hmDocumentLAdd@36
5B __imp__hmDocumentLAdd@36
5B _hmDocumentLAdd@36
然后通过 undname 运行它会导致:
> undname ?_hmDocumentLAdd@36
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
Undecoration of :- "?_hmDocumentLAdd@36"
is :- "?_hmDocumentLAdd@36"
这是错误的。如果我从 IDE 中输入损坏的名称,它会给出更好的结果:
> undname ?hmDocumentLAdd@@YGHPAD0J00JJJPAJ@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
Undecoration of :- "?hmDocumentLAdd@@YGHPAD0J00JJJPAJ@Z"
is :- "int __stdcall hmDocumentLAdd(char *,char *,long,char *,char *,long,long,l
ong,long *)"
现在我有了这些信息,我能用它做什么?从这篇Raymond Chen 文章看来,我可以手动修复它,但可以调整一个选项,但我无法从结果中辨别出需要什么选项(是否有“忽略所有参数”复选框?!)。
因此,它似乎正在寻找不存在的函数或函数的参数已被忽略(或 dumpbin 不喜欢 VC6 库),但它仍然没有让我更接近解决问题的目标。