我试图用托管 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 error LNK2028: unresolved token (0A0000B3) "public: __thiscall Terminal::Terminal(void)"(??0Terminal@@$$FQAE@XZ) referenced in function "public: __clrcall ManagedTerminal::ManagedTerminal(void) )"(??0ManagedTerminal@@$$FQ$AAM@XZ) ManagedTerminal.obj TerminalWrapper
错误 6 error LNK2019: 未解析的外部符号“public: __thiscall Terminal::Terminal(void)” (??0Terminal@@$$FQAE@XZ) 在函数“public: __clrcall ManagedTerminal::ManagedTerminal(void)”中引用(??0ManagedTerminal@@$$FQ$AAM@XZ) ManagedTerminal.obj TerminalWrapper
谁能告诉我这是怎么回事? 谢谢:)
最佳答案
您必须匹配所有build设置——特别是调用约定(CDECL 与 STDCALL)——才能成功链接。
自 .NET 2.0 以来,您还必须动态链接到 c 运行时,因此请确保 .dll 和托管 C++ 项目都这样做。
基本上,进入两个项目的属性对话框并确保影响调用的内容相同。
关于c++ - 用托管类包装 C++ DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3963130/