0

我已经编译了 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 重新编译静态库是不可取的(并且可能是不可能的)。我该如何使用它们?

4

1 回答 1

4

有困难。

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

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

  • 如果这些库完全集成到您的代码中,那么您最好的选择就是简单地让步并将您的应用程序编译为 32 位。
  • 如果您有超级关键的绝对必须是 64 位代码,但库调用不在快速路径中,您可以将它们编译成一个 32 位帮助程序,作为附加进程生成并通过一些IPC 的形式。
  • 否则,您将看到某种形式的二进制翻译的荒谬不切实际的前景。

我收集到 iOS 不提供对 IPC 的支持,这在这种特殊情况下排除了第二个选项。

于 2014-08-11T18:52:30.070 回答