【问题标题】:LNK2001: What have I forgotton to set?LNK2001:我忘了设置什么?
【发布时间】:2010-03-29 13:54:37
【问题描述】:

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

所以我创建了一个 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 并且它们刚刚工作,所以我忘了做什么?

更新:根据this thread,我查看是否可以找到任何其他信息。这就是 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 *)"

现在我有了这些信息,我能用它做什么?从这个Raymond Chen article 看来,我可以手动修复它但调整一个选项,但我无法从我的结果中辨别出需要什么选项(是否有一个“忽略所有参数”复选框?!)。

所以它似乎正在寻找不存在的函数或函数的参数已被遗漏(或 dumpbin 不喜欢 VC6 库),但它仍然没有让我更接近修复我的目标问题。

【问题讨论】:

  • 您是否使控制台应用程序依赖于库?
  • 是的。 dll 在应用程序之前编译。
  • 你是否在使用 'c' 接口 extern 'c' 之类的东西?
  • 没有那样的。该项目编译并与其他六个项目一起工作 - 没有一个有这个问题。办公室里的另一个人看了看,他也想不通。
  • 那么我会建议,回退到它确实有效的以前版本,然后从那里继续前进

标签: dll visual-c++-6 linker-errors lnk2001


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-09-23
    • 2018-07-02
    • 2019-07-11
    • 2019-10-04
    • 2018-07-16
    • 2013-09-08
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    相关资源
    最近更新 更多