托管C ++未解析的令牌

时间:2009-06-01 19:43:51

标签: managed-c++

我是托管C ++的新手。

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

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

LibTest也编译为.dll,但是当它进入链接时,我在所有Lib ::方法上得到“未解析的标记”。这些方法定义在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 Project(编译为.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;
}

4 个答案:

答案 0 :(得分:9)

托管C ++就像C#一样,关于不同程序集中的类型。这意味着您需要将Lib类声明为public

public ref class Lib

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

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

答案 1 :(得分:1)

如果您使用的是托管扩展程序,则应该只需要正确设置引用。

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

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

答案 2 :(得分:1)

在项目LibTest中,属性->配置属性->链接器->输入->设置其他依赖项,包括Lib.lib

答案 3 :(得分:0)

以下是Bojan提出的最终修改。谢谢Bojan!

注意:别忘了在“LibTest”参考中添加“Lib”!

Lib Project(编译为.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;
}