我可以将C ++库编译成dylib并在iOS 9项目中使用它们吗?

时间:2016-05-16 15:37:56

标签: c++ ios xcode dylib

我有一个iOS应用程序,它使用liblzma。我目前能够成功编写跨平台编译脚本,将源代码编译成.a文件,并在项目中使用.a和header。

现在在iOS 8及更高版本中,Apple开始支持动态链接,所以我很想知道我是否能够在我的项目中使用liblzma.dylib而不是liblzma.a。但我失败了。

这就是我所做的:

  1. 修改我之前用来编译liblzma.a的编译脚本。我将--disable-shared更改为--enable-shared,然后使用lipo将每个arch的.dylib组合成一个胖.dylib。

  2. 我从项目中删除了liblzma.a,并将liblzma.dylib添加到我的项目中

  3. 建立,成功。但是当在设备上运行时,我遇到了以下错误

  4.   

    dyld:未加载库:/Volumes/Data/Developer/build/xz-5.2.2/build/iOS/arm64/lib/liblzma.5.dylib     参考自:/var/containers/Bundle/Application/AB7A063F-9C3F-4CEB-A757-965238947000/****.app/****     原因:不兼容的库版本:****需要8.0.0或更高版本,但liblzma.5.dylib提供版本6.0.0   (lldb)

    1. 我用工具检查新构建的.dylib的实际版本,这就是我得到的
    2.   

      /Volumes/Data/Developer/build/xz-5.2.2/build/iOS/Universal/lib/liblzma.5.dylib:       /Volumes/Data/Developer/build/xz-5.2.2/build/iOS/x86_64/lib/liblzma.5.dylib(兼容版本8.0.0,当前版本8.2.0)       /usr/lib/libSystem.dylib(兼容性版本1.0.0,当前版本1226.10.1)

      我有几个问题:

      • 我可以像这样添加dylib吗?
      • 当我运行应用程序时,liblzma.dylib实际上是否已复制到我的iOS设备?
      • 为什么错误消息显示 liblzma.5.dylib提供版本6.0.0 ,而otool显示当前版本8.2.0
      • 我知道iOS 8.0+应用程序要使用dylib,dylib也需要签名。我该怎么做?

      谢谢!

1 个答案:

答案 0 :(得分:0)

解决!

  • 是的,我可以像那样加载dylib
  • 我需要为要复制的dylib添加复制文件构建阶段
  • 当没有复制liblzma.dylib时,iOS似乎已经在设备上使用了liblzma.dylib,其版本号低于所需的版本号
  • 我需要使用install_name_tool
  • 修改dylib的安装名称