【问题标题】:Linker error when calling function in native C++ from a c++/cli project从 c++/cli 项目调用本机 C++ 中的函数时出现链接器错误
【发布时间】:2013-06-18 12:06:21
【问题描述】:

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

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

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

我的问题:

  1. 我还有什么需要做的吗?
  2. 在本节中添加引用是否意味着该引用是一个 .net 程序集?或者它可能是对静态库的引用。

编辑 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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

      李>

    【讨论】:

      【解决方案2】:

      $$F 部分给定的重整名称是函数修饰符的标记,这意味着托管函数 [托管 C++ 或 C++/CLI],根据 "Visual C++ name mangling"

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

      我刚刚修复了这个问题并进行了重建,它帮助了我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-17
        • 1970-01-01
        • 1970-01-01
        • 2018-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多