LNK2020:未解析的令牌(06000001)

时间:2014-06-03 23:25:04

标签: .net visual-c++ linker c++-cli linker-errors

现有两个A.vcxproj和M.vcxproj。 A.vcxproj输出是(A.lib)& M.vcxproj输出类型是(M.exe)。 在M.vcproj项目设置中,Linker-> Input-> Additional Dependencies A.Lib作为输入给出。这两个项目都支持公共语言运行时支持(/ clr)。这两个项目已经成功构建,M.exe工作正常。

现在到A.vcxproj,我添加了两个文件EDBGW.h和EDBGW.cpp,其中 EDBGW.h文件有:

public ref class EDBGW{
  public :
   EDBGW();
}

EDBGW.cpp具有构造函数的实现:

EDBGW::EDBGW(){

}

还有一个文件R.h包含EDBGW.h,即 在R.h

  #include "EDBGW.h"

现在当我构建A.vcxproj时,没有构建错误 但是,如果我构建M.vcxproj,则会出现链接器错误

2>A.lib(R.obj) : error LNK2020: unresolved token (06000001) EDBGW::.ctor

注意:我根本不在M.vcproj中使用EDBGW。 但我仍然有这个链接器错误。

3 个答案:

答案 0 :(得分:2)

嗯,当然你得到了链接器错误。构造函数位于完全不同的可执行文件中。

您必须取消调整传统的C ++标头 - 在使用托管代码时要稍微考虑一下。它对模块有很强的支持。 .NET中的程序集说话。它们不仅仅存储代码,它们还具有描述程序集中类型的元数据。相当于.h文件。

因此,您不再需要显式导出代码,只需声明类 public 即可。你已经找到了。但是,不是#including .h文件,而是添加对程序集的引用。右键单击M项目,“属性”,“公共属性”,“引用”。单击“添加新引用”按钮。选择你的A项目。

编译器现在将自动了解您的EDBGW类,它从A.dll中的元数据中读取其声明。并且它知道它必须在M之前构建A。绑定到构造函数发生在运行时而不是构建时间,由即时编译器执行。

答案 1 :(得分:0)

如果有静态库项目(本机或托管),最好不要通过Additional Dependencies使用其.lib文件。而是使用项目参考作为汉斯详细。您还将包含头文件,与Hans'相反。的答案。

当您使用项目引用时,Visual Studio负责与其他项目的输出链接,自动导致首先构建其他项目,并使用匹配的构建配置(发布与调试,32位与64位等) 。)

使用项目引用到静态库项目时的另一个选项是选择选项"使用库源"或类似的东西,它导致库项目中的所有目标文件被链接,而不需要通常修剪未使用的对象。很可能你不会需要这个选项;我怀疑你的问题是由链接到.lib的旧副本引起的,这是你在使用项目引用时遇到的问题。

答案 2 :(得分:0)

我遇到了相同的链接器错误并且在这里结束但原因很简单:.ctor表示构造函数。确保你记得实现你的构造函数。 (是的,我是莳萝。)