我决定退后一步,试着让一个非常简单的概念证明起作用。
由于围绕这一主题的Xamarin Lightning Lectures之一,我进一步发展了。我一直在关注这个教程: https://university.xamarin.com/lightninglectures/ios-bindings-in-cc
这是我到目前为止所做的:
1)我有一个简单的C文件“example.c”,包含3个函数:addOne(int n),subtractOne(int n),get_time()
2)如教程所示,我使用SWIG创建了一个C包装类 - “example_wrap.c”(以及C#包装类)。
3)我在Xcode中创建了静态库,并构建了一个包含所有体系结构的FAT二进制文件(用于组合库的lipo)。
本教程讨论创建2个项目 - 一个使用C#包装器类,另一个使用单个视图iOS应用程序。 iOS项目具有 libexample.a
静态库(作为BundledResource)。在尝试构建iOS应用程序之前,一切进展顺利。我无法编译iOS应用程序。我暂时删除了对静态库的任何调用以隔离问题....我只是想让它正确编译和链接。所以我现在所拥有的只是一个带有捆绑静态库的空白iOS应用程序。但是我还有问题。
我在mtouch参数中添加了以下内容: -cxx -gcc_flags" -L $ {ProjectDir} -lexample -force_load $ {ProjectDir} /llexample.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_64 libexample.a ”来仔细检查libexample.a文件中的符号。似乎列出了该架构的所有符号。
以下是我的libexample.a和C文件的zip文件的链接: https://drive.google.com/open?id=0B2WtJ38rvldKYmlZckU3QjNBeUE
我确定这只是一个配置错误,但我似乎无法确定我哪里出错了。
感谢。
答案 0 :(得分:1)
我想我会在这里回答我自己的问题 - 在得到Xamarin支持的一些帮助之后,看起来我可能已经混淆了我如何创建静态库 - 我必须确保文件被编译为'C'文件,而不是C ++。在我正确生成静态库之后,编译器能够识别丢失的符号。