【问题标题】:Managed C++ unresolved token托管 C++ 未解析令牌
【发布时间】:2018-10-01 09:47:48
【问题描述】:

我是托管 C++ 的新手。

我在一个 .sln 中有两个托管 C++ 项目,Project Lib 和 Project LibTest。 LibTest 使用了 Lib。

Lib 编译和链接正常。项目设置为 .dll。

LibTest 也被编译为 .dll,但是当它进入链接时,我在所有 Lib::methods 上都得到“未解析的令牌”。这些方法定义在 Lib .cpp 文件中定义。

如果我将定义移到 Lib.h 文件中,一切正常。

我已经修改了 LibTest 的 Reference 以依赖于 Lib 项目。

我错过了什么?

编辑:好的,这正是我所拥有的,但它仍然无法正常工作。

首先,我使用的是 Visual Studio 2008 SP1。

其次,当我在 C# 中进行类似的练习时,它运行良好。

我创建了一个空的 C++ CLR 项目。我添加了一个 Lib 项目。我添加了一个托管类。 VSTD 生成 Lib.h 和 Lib.cpp。构造函数是自动生成的。

然后我在我的解决方案中添加了另一个项目;我称它为 LibTest。我添加了另一个名为 LibTest 的托管类。生成 LibTest.h 和 LibTest.cpp。我试图在 LibTest 构造函数中实例化 Lib,但在链接过程中它只是说:

1>LibTest.obj : 错误 LNK2020: 未解析的令牌 (06000002) Lib::.ctor

这是确切的代码:

Lib 项目(编译为 .dll 项目)

//Lib.h
#pragma once

ref class Lib
{
public:
  Lib(void);
};


//Lib.cpp
#include "Lib.h"

Lib::Lib(void)
{
}

LibTest 项目(编译为 application.exe)

// LibTest.h
#pragma once

ref class LibTest
{
public:
  LibTest(void);
};

// LibTest.cpp
#include "LibTest.h"
#include "Lib.h"

LibTest::LibTest(void)
{
  Lib^ lib = gcnew Lib;
}

int main()
{
  return 0;
}

【问题讨论】:

  • 哇..我必须说..来自非托管 C++..我一直希望开发环境(在本例中为 VSTD IDE)来管理#include,以及所有没有我的库链接必须明确指定它。这真是太神奇了!我想告诉整个非托管 C++ 世界! (我只落后了 6 年!=p)

标签: managed-c++


【解决方案1】:

对于不同程序集中的类型,托管 C++ 的工作方式与 C# 类似。这意味着您需要将您的Lib 类声明为public

public ref class Lib

并且您不应该在您的LibTest 项目中包含Lib.h。当您添加对Lib 项目的引用时,编译器将能够解析在那里找到的任何符号。

您当前的代码包括Lib.h,因此链接器在LibTest 程序集中搜索Lib 类并在那里查找构造函数。

【讨论】:

  • 谢谢你,博扬;问题解决了。我希望我能投票给你 10 次..但是 stackoverflow 只允许 1 次。;-)
  • 任何时候 - 我很高兴它有帮助:)
【解决方案2】:

如果您使用的是托管扩展,则只需正确设置引用即可。

如果您使用标准 C++ 函数,您可能需要使用 __declspec(dllexport)__declspec(dllimport) 定义您的函数。 See MSDN for details.

__declspec(dllexport) 将特定函数添加到导出库中,__declspec(dllimport) 告诉导入库 (LibTest) 它需要从 DLL 导入这些符号。

【讨论】:

    【解决方案3】:

    在项目LibTest中,property->Configuration properties->Linker->Input->set Additional Dependecies,包含Lib.lib

    【讨论】:

      【解决方案4】:

      这是 Bojan 提出的最终修改。谢谢博扬!

      注意:不要忘记将“Lib”添加到您的“LibTest”参考!

      Lib 项目(编译为 .dll 项目)

      //Lib.h

      #pragma once
      
      public ref class Lib
      {
      public:
        Lib(void);
      };
      

      //Lib.cpp

      #include "Lib.h"
      
      Lib::Lib(void)
      {
      }
      

      LibTest 项目(编译为 application.exe)

      // LibTest.h

      #pragma once
      
      ref class LibTest
      {
      public:
        LibTest(void);
      };
      

      // LibTest.cpp

      #include "LibTest.h"
      
      LibTest::LibTest(void)
      {
        Lib^ lib = gcnew Lib;
      }
      
      int main()
      {
        return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2021-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多