我试图用托管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 ++项目都这样做。
基本上,进入两个项目的属性对话框,并确保影响调用的内容相同。