我试图用C#调用c ++中的函数,为此,我创建了一个C ++ / CLI项目来包装C ++代码。
我的代码编译,但在链接期间,我收到错误,链接器无法找到c ++代码中定义的方法。
c ++代码是一个静态库,我在C ++ / CLI项目中添加对它的引用(常用属性 - >框架和引用 - >添加新引用)
我的问题:
修改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
答案 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">
我已经修复了它并进行了重建,它对我有帮助。