c++ - 用托管类包装 C++ DLL

标签 c++ linker unmanaged wrapper managed

我试图用托管 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/

相关文章:

c++ - 逐行读取文件

c++ - std::unique_ptr 用于需要免费的 C 函数

c++ - sizeof() 的值是由编译器还是链接器决定的?

c++ - 对于需要全局范围的固定数量的对象,堆栈与堆

c++ - 向右移动4个整数不同的值SIMD

c++ - Visual Studio强制在项目的所有编译单元中包含预编译头文件?

visual-c++ - MSVC 编译器和 COMDAT 折叠的链接器选项之间的关系

c# - 奇怪的 C# 平台调用/DLLImport 行为

c# - 在 P/Invoke 中使用 ref struct 或 class

c++ - 为什么我在 DLL 中收到 "Unable to find an entry point named ' SquareRoot' 消息?