我正在尝试用托管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
谁能告诉我什么是错的? 谢谢:))答案 0 :(得分:1)
您必须匹配所有构建设置 - 特别是调用约定(CDECL与STDCALL) - 才能获得成功的链接。
从.NET 2.0开始,您还必须动态链接到c-runtime,因此请确保.dll和托管C ++项目都执行此操作。
基本上,进入两个项目的属性对话框,确保影响调用的内容相同。