【问题标题】:Wrapping a C++ DLL with a managed class用托管类包装 C++ DLL
【发布时间】:2011-04-27 03:52:51
【问题描述】:

我正在尝试使用托管 C++ 包装非托管 C++ DLL,但我不断收到链接错误。

即使我在项目中包含了 library.lib 并包含了正确的头文件。

这是托管类:

#pragma once
#include "..\Terminal\Terminal.h"
public ref class ManagedTerminal
{
    private:
Terminal * m_unTerminal;
public:

ManagedTerminal(void)
{
    m_unTerminal = new Terminal();
}
};

这是非托管类:

#include "..\Core1.h"
#include "..\Core2.h"

 __declspec(dllexport) class Terminal
{
private:
CoreObj m_core;

public:
Terminal();
void Init(char* path, char* filename);    
void Start();
void Stop();
void Run();
Array<Report> GetSnapshot();
~Terminal(void);
};

我得到的错误是:

错误 5 错误 LNK2028: 未解析的令牌 (0A0000B3) "public: __thiscall Terminal::Terminal(void)" (??0Terminal@@$$FQAE@XZ) 在函数 "public: __clrcall ManagedTerminal::ManagedTerminal(void) 中引用)" (??0ManagedTerminal@@$$FQ$AAM@XZ) ManagedTerminal.obj TerminalWrapper

错误 6 错误 LNK2019:未解析的外部符号“public: __thiscall Terminal::Terminal(void)”(??0Terminal@@$$FQAE@XZ) 在函数“public: __clrcall ManagedTerminal::ManagedTerminal(void)”中引用(??0ManagedTerminal@@$$FQ$AAM@XZ) ManagedTerminal.obj TerminalWrapper

谁能告诉我怎么了? 谢谢:)

【问题讨论】:

  • 非托管 C++ dll 是否使用 boost::thread?
  • [我在尝试使用托管 c++ 包装原生 c++ 类时得到 LNK2028 的可能重复项](stackoverflow.com/questions/721387/…)
  • 你能尝试做一个可能重现问题的小例子吗?
  • 贴出exact错误信息,符号名称提供了很多线索。当然还有一个显示声明的 sn-p。

标签: c++ linker unmanaged wrapper managed


【解决方案1】:

您必须匹配所有构建设置——特别是调用约定(CDECL 与 STDCALL)——才能获得成功的链接。

从 .NET 2.0 开始,您还必须动态链接到 c-runtime,因此请确保 .dll 和托管 C++ 项目都执行此操作。

基本上,进入两个项目的属性对话框并确保影响调用的内容相同。

【讨论】:

  • 我已将托管项目的调用约定更改为“__cdecl”(如在非托管项目中),但现在我收到错误:错误 30 致命错误 LNK1104:无法打开文件 '..\ Debug\Terminal.lib' 即使它在那里。
  • 从 Microsoft 下载 procmon.exe 并为包含 Terminal.lib 的路径设置一个过滤器,并确保它使用您认为的 PATH。另外,如果无法打开,procmon 会告诉你原因。
猜你喜欢
  • 1970-01-01
  • 2011-10-30
  • 2011-04-29
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多