6

我是托管 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;
}
4

4 回答 4

10

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

public ref class Lib

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

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

于 2009-06-02T08:32:37.133 回答
1

如果您使用的是托管扩展,那么正确设置引用应该是您所需要的。

如果您使用标准 C++ 函数,您可能需要使用__declspec(dllexport)和定义您的函数__declspec(dllimport)有关详细信息,请参阅 MSDN

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

于 2009-06-01T19:50:05.390 回答
1

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

于 2018-10-01T01:47:48.467 回答
0

这是 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;
}
于 2009-06-02T20:28:28.763 回答