【问题标题】:Binding a static library into a Xamarin iOS project将静态库绑定到 Xamarin iOS 项目
【发布时间】:2016-12-05 21:27:51
【问题描述】:

我决定退后一步,尝试让一个非常简单的概念证明发挥作用。

感谢围绕该主题的 Xamarin Lightning 讲座之一,我取得了进一步的进展。我一直在关注这个教程: 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}/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_64 libexample.a”仔细检查了 libexample.a 文件中的符号。似乎列出了该架构的所有符号。

这是一个指向包含我的 libexample.a 和 C 文件的 zip 文件的链接: https://drive.google.com/open?id=0B2WtJ38rvldKYmlZckU3QjNBeUE

我确定这只是一个配置错误,但我似乎无法确定哪里出错了。

谢谢。

【问题讨论】:

  • 我在创建 C++ 到 C# 包装器时使用 CppSharpgithub.com/mono/CppSharp
  • 感谢您的信息,但我正在寻找一种将这个静态库引入 Xamarin 的方法。我现在听说我可能必须编写一个 Objective C 包装器,并且想知道是否有人做过类似的事情。
  • ?,我使用 CppSharp 将 iOS/Android 原生 C++ 库引入 Xamarin.iOSXamarin.Android.... 编写 Obj-C 包装器,然后使用 Sharpie 引导 C# 绑定是一种方法。当然,这必须针对每个平台重复......但我个人认为这是更多的工作,它只是必须执行的另一层代码,还需要同步到 C++ 库中的任何更改.
  • @SushiHangover,你让我走上了正轨。此外,还有一个 Xamarin 大学闪电讲座,涵盖了我想要完成的工作。这是一个链接,以防其他人正在寻找它:university.xamarin.com/lightninglectures/ios-bindings-in-cc 我将按照这个示例作为概念证明。

标签: xamarin xamarin.ios xamarin.forms


【解决方案1】:

我想我会在这里回答我自己的问题 - 从 Xamarin 支持获得一些帮助后,看起来我可能混淆了我创建静态库的方式 - 我必须确保文件被编译为“C”文件,而不是 C++。正确生成静态库后,编译器能够识别缺失的符号。

【讨论】:

    猜你喜欢
    • 2018-08-02
    • 1970-01-01
    • 2015-02-10
    • 2014-05-10
    • 2013-07-09
    • 1970-01-01
    • 2011-09-01
    • 2017-06-16
    相关资源
    最近更新 更多