如何将iPad Air app(arm64)与现有的armv7静态库相链接?

时间:2014-08-11 18:17:34

标签: xcode linker arm armv7 arm64

我编译了armv7静态库(lib * .a),我将编译iPad Air应用程序(arm64)。 我收到链接器警告,然后是链接器错误:

$ lipo -info /Users/user/Documents/dev/src/iOS_Projects/iProject/libMyLib.a
input file /Users/user/Documents/dev/src/iOS_Projects/iProject/libMyLib.a is not a fat file
Non-fat file: /Users/user/Documents/dev/src/iOS_Projects/iProject/libMyLib.a is architecture: armv7

Ld: warning: ignoring file /Users/user/Documents/dev/src/iOS_Projects/iProject/libMyLib.a, file was built for archive which is not the architecture being linked (arm64): /Users/user/Documents/dev/src/iOS_Projects/iProject/libMyLib.a ignoring file

为arm64重新编译静态库是不可取的(也可能是不可能的)。我该如何使用它们?

1 个答案:

答案 0 :(得分:4)

有困难。

您只能在异常边界处切换AArch32状态和AArch64状态,因此,例如64位内核/ 32位用户空间是可能的,在单个进程中不可能同时使用它们。因为它是完全不同的指令集/寄存器布局/异常模型/等。 ARM / Thumb的风格没有32/64位互通(基本上只是相同指令的不同编码)。

一般情况下(我不熟悉iOS细节,但我认为它支持“传统”AArch32进程,就像Linux一样):

  • 如果这些库与您的代码完全不可分割,那么最好的办法就是简单地让您的应用程序以32位的形式编译。
  • 如果你有超级关键 - 绝对必须是64位代码但是库调用不在快速路径中,你可以将它们编译成一个32位辅助程序,你作为一个额外的进程生成通过某种形式的IPC打电话。
  • 否则你会看到某种形式binary translation的荒谬不切实际的前景。

我认为iOS不支持IPC,而在这种情况下排除了第二种选择。