0

继我之前关于调试本机代码的问题之后,我决定从控制台应用程序创建一个简单的测试,因为我无法直接调试服务。

所以我创建了一个 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 库),但它仍然没有让我更接近解决问题的目标。

4

1 回答 1

1

您是否使用正确的调用约定?您的图书馆似乎使用stdcall. 也许您的测试代码正在使用cdecl(似乎是默认值)。

根据此页面,链接器名称装饰在不同的校准约定之间有所不同,因此这可以解释您所看到的症状。

于 2010-04-13T08:12:42.430 回答