从c ++ / cli项目中调用本机C ++中的函数时出现链接器错误

时间:2013-06-18 12:06:22

标签: c++-cli interop wrapper linker-errors static-linking

我试图用C#调用c ++中的函数,为此,我创建了一个C ++ / CLI项目来包装C ++代码。

我的代码编译,但在链接期间,我收到错误,链接器无法找到c ++代码中定义的方法。

c ++代码是一个静态库,我在C ++ / CLI项目中添加对它的引用(常用属性 - >框架和引用 - >添加新引用)

我的问题:

  1. 我还有什么其他的吗?
  2. 在此部分中添加引用意味着引用是.net程序集?或者它可以是静态库的引用。
  3. 修改1

    我在Windows 7 64bit上唱VS 2012

    链接器错误:

    Error   3   error LNK2019: unresolved external symbol "public: static class MyFile __cdecl MyFile::ReadMyFile(char *)" (?ReadMyFile@MyFile@@$$FSA?AV1@PAD@Z) referenced in function "public: static class MyFileWrapper::MyFileWrapper ^ __clrcall MyFileWrapper::MyFileWrapper::ReadMyFile(class System::String ^)" (?ReadMyFile@MyFileWrapper@1@$$FSMP$AAV11@P$AAVString@System@@@Z)  MyFileWrapper.obj
    

2 个答案:

答案 0 :(得分:1)

您没有发布链接器错误消息,这使得很难准确回答此问题。最常见的原因:

  • 忘记告诉编译器该函数是本机函数而不是托管函数。当您使用__clrcall调用约定看到它时,您可以从链接器错误消息中看出,本机代码通常使用__cdecl调用约定。您可以通过在#include之前放置#pragma managed(push,off)来解决这个问题,然后将#pragma managed(pop)放在它之后。

  • 尝试链接使用/ clr编译的静态库。不幸的是,如果没有在构建库时对此进行投诉,则不支持。 CLR已经很好地支持了等价物,它在运行时绑定了库。你可以通过创建一个类库项目来解决这个问题,这样你就可以在构建它之后得到一个DLL。使用“添加引用”从该程序集导入声明,而不是使用#include。

  • 忘记告诉链接器需要链接非托管静态库或导入库。 VS2010及更高版本支持使用Add Reference,在早期版本的VS上,您需要使用链接器,输入,附加依赖项设置或在源代码中使用#pragma comment(lib,“name”)。

答案 1 :(得分:0)

$$F的一部分是功能修饰符的标记,根据"Visual C++ name mangling",这是托管功能[Managed C ++或C ++ / CLI]。

我遇到了非常相似的问题。我发现我的情况是: <ProjectReference Include="ProjName\ProjName.vcxproj"> <ProjectReference Include="..\ProjName\ProjName.vcxproj">

我已经修复了它并进行了重建,它对我有帮助。