2

我正在尝试从 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
4

2 回答 2

1

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

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

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

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

于 2013-06-18T12:26:11.397 回答
0

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

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

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

于 2018-12-20T13:00:54.427 回答