C ++中托管的未解析的外部符号

时间:2012-12-18 07:53:03

标签: visual-studio-2012 c++-cli managed

我使用/ clr编译的C ++管理的dll具有一些全局函数。

例如

void Managed2UnManaged(DataStructures::AAA^ elem, DataStructures::CPP::AAA* copy_elem);    

当我尝试在C ++托管控制台应用程序中使用这些函数时,我收到以下错误

错误LNK2028:未解析的令牌(0A00048C)“void __clrcall Managed2UnManaged(类DataStructures :: AAA ^,类DataStructures :: CPP :: AAA *)”(?Managed2UnManaged @@ $$ FYMXP $ AAVAAA @ DataStructures @ NextIn @@ PAV1CPP @ 23 @@ Z)

错误LNK2019:未解析的外部符号“void __clrcall Managed2UnManaged(类DataStructures :: AAA ^,类DataStructures :: CPP :: AAA *)”(?Managed2UnManaged @@ $$ FYMXP $ AAVAAA @ DataStructures @ NextIn @@ PAV1CPP @ 23 @@ Z)

我在控制台应用程序中添加了对dll的引用,但它仍然给出了错误。

我也尝试添加__declspec(dllexport),但后来我得到

错误C3395:'Managed2UnManaged':__ declspec(dllexport)无法应用于具有__clrcall调用约定的函数

如果我指定__stdcall,我会得到

错误C4439:'Managed2UnManaged':签名中具有托管类型的函数定义必须具有__clrcall调用约定

我正在使用VS2012。

h文件有

class XXX {
 public:
static void Managed2UnManaged(DataStructures::RegResult^ elem,     DataStructures::CPP::RegResult* copy_elem);
};

和cpp文件

 void XXX::Managed2UnManaged(DataStructures::RegResult^ elem, DataStructures::CPP::RegResult* copy_elem)
{

}

解决了问题。问题是我还需要声明类public ref。这导致了一个不同的问题,因为本机c ++类型是私有的。所以我不得不使用make_public pragma。 谢谢大家。

1 个答案:

答案 0 :(得分:2)

我认为问题可能是CLR不允许全局功能。

您必须创建一个托管类,并将您的函数编写为该类的静态成员函数,以便导出该函数。