将静态库绑定到Xamarin iOS项目中

将静态库绑定到Xamarin iOS项目中,xamarin,xamarin.ios,xamarin.forms,Xamarin,Xamarin.ios,Xamarin.forms,我决定退后一步,试着得到一个非常简单的概念证明 多亏了Xamarin围绕这个主题的闪电讲座,我取得了更大的进步。我一直在学习本教程: 以下是我迄今为止所做的工作: 1) 我有一个简单的C文件“example.C”,它有3个函数:addOne(intn)、subtractOne(intn)、get_time() 2) 如本教程所示,我使用SWIG创建了一个C包装类——“example_wrap.C”(以及C包装类) 3) 我在Xcode中创建了静态库,并构建了一个包含所有体系结构的胖二进制文件(

我决定退后一步,试着得到一个非常简单的概念证明

多亏了Xamarin围绕这个主题的闪电讲座,我取得了更大的进步。我一直在学习本教程:

以下是我迄今为止所做的工作:

1) 我有一个简单的C文件“example.C”,它有3个函数:addOne(intn)、subtractOne(intn)、get_time()

2) 如本教程所示,我使用SWIG创建了一个C包装类——“example_wrap.C”(以及C包装类)

3) 我在Xcode中创建了静态库,并构建了一个包含所有体系结构的胖二进制文件(lipo用于组合libs)

本教程介绍如何创建两个项目——一个使用C#包装器类,另一个使用单视图iOS应用程序。iOS项目具有libexample.a静态库(作为捆绑资源)。在尝试构建iOS应用程序之前,一切都进展顺利。我无法编译iOS应用程序。我现在已经删除了对静态库的所有调用,以隔离问题……我只是想让它正确编译和链接。所以我现在所拥有的只是一个带有捆绑静态库的空白iOS应用程序。但我还是有问题

我在mtouch参数中添加了以下内容: -cxx-gcc_标志“-L${ProjectDir}-lexample-force_load${ProjectDir}/libexample.a”

编译时,我会遇到以下错误:

Undefined symbols for architecture x86_64:
"subtractOne(int)", referenced from:
_CSharp_subtractOne in libexample.a(example_wrap.o)
"addOne(int)", referenced from:
_CSharp_addOne in libexample.a(example_wrap.o)
"get_time()", referenced from:
_CSharp_get_time in libexample.a(example_wrap.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我通过从命令行运行“nm-arch x86\u 64 libexample.a”仔细检查了libexample.a文件中的符号。似乎列出了该体系结构的所有符号

下面是指向zip文件的链接,其中包含我的libexample.a和C文件:

我确信这只是一个配置错误,但我似乎无法指出哪里出了问题


谢谢。

< p>我想我会回答我自己的问题。在得到XAMARIN支持的帮助之后,看起来我可能混淆了我是如何创建静态库的。我必须确保文件被编译成“C”文件,而不是C++。在我正确生成静态库之后,编译器能够识别丢失的符号。

我在创建
C++
到C的包装器时使用
CppSharp
:感谢您提供的信息,但我正在寻找将此静态库引入Xamarin的方法。我现在听说我可能要编写一个目标C包装器,想知道有没有人做过类似的事情。我用<代码> CPPHARP</代码>把iOS/ Android原生C++库带到<代码> XAMARIN。编写Obj-C包装,然后使用Sharpie引导C#绑定是一种方法。当然,每个平台都必须重复此操作。。。但我个人认为这是一个更大的工作,它只是另一层代码,必须执行,并且需要同步到C++ LIB的任何更改。@ SushiHangover,你让我走上了正确的轨道。此外,还有一个Xamarin大学的闪电讲座,内容涵盖了我试图完成的任务。这里有一个指向它的链接,以防其他人正在寻找它:我将遵循这个示例作为概念证明。