Dll LNK2001:我忘了设置什么?

Dll LNK2001:我忘了设置什么?,dll,visual-c++-6,linker-errors,lnk2001,Dll,Visual C++ 6,Linker Errors,Lnk2001,继我关于本机代码调试的讨论之后,我决定从控制台应用程序创建一个简单的测试,因为我无法直接调试服务 因此,我创建了一个vc6控制台应用程序,将dll项目添加到工作区并运行它 它没有按预期执行,而是抛出了以下链接器错误: main.obj : error LNK2001: unresolved external symbol "int __stdcall hmDocumentLAdd(char *,char *,long,char *,char *,long,long,long,long *)"

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

因此,我创建了一个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文件更改为load,则会出现
致命错误LNK1104:无法打开文件“asdf.lib”
,因此这不是问题

我以前链接过dll,它们刚刚工作,那么我忘记做什么了?

更新:根据,我想看看是否能找到任何其他信息。这是VS2005的dumpbin给我的

> 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 *)"
现在我有了这个信息,我能用它做什么?从这看来,我可以手动修复它,但调整了一个选项,但我无法从结果中分辨出需要什么选项(是否有“忽略所有参数”复选框?!)


因此,它似乎在寻找不存在的函数,或者函数的参数被省略了(或者dumpbin不喜欢VC6 libs),但它仍然没有让我更接近解决问题的目标。

您是否使用了正确的调用约定? 您的库似乎使用了
stdcall
。可能您的测试代码正在使用
cdecl
(似乎是默认值)


根据,链接器名称装饰不同于校准约定,因此这可以解释您看到的症状。

您是否使控制台应用依赖于库?是的。dll在应用程序编译之前就编译好了。你在用“c”接口extern“c”之类的东西做什么吗?不是这样的。该项目汇编了六个其他项目,并与之合作,但没有一个项目存在这个问题。办公室里的另一个人也看了一下,他也不明白。那么我建议,回到以前的版本,在那里它确实有效,然后继续前进