我试图用托管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)“公共:__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)”中引用(?? 0 ManagedTerminal @@ $$ FQ $ AAM @ XZ)ManagedTerminal.obj TerminalWrapper

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

最佳答案

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

从.NET 2.0开始,您还必须动态链接到c运行时,因此请确保.dll和托管C ++项目都这样做。

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

10-07 23:44