gpt4 book ai didi

iphone - 如何制作可在 iOS 5 至 7 上运行的 armv7 arm64 fat 二进制文件?

转载 作者:可可西里 更新时间:2023-11-01 05:09:16 26 4
gpt4 key购买 nike

Apple 多年来一直在更改指令集。由于单个程序可能需要在不止一种机器上运行,Apple 使用名为“lipo”的工具构建的“fat binaries”。您告诉 Xcode 多次编译您的程序,针对每种机器类型编译一次,然后 lipo 将它们绑定(bind)在一起。

Apple 最近推出了第四个 iOS 指令集。第一批手机使用 Armv6,从 3GS 开始,我们有 Armv7,为 Armv7 添加了一些新指令,现在,5S 添加了 Arm64。

我喜欢我的程序在一系列操作系统下运行,所以我将我的 MIN_DEPLOYMENT_TARGET 设置为 5.0,这样 Apple 就会在 5.0 以后的机器上加载该程序。但是当在当前版本的 Xcode 中尝试这样做时,我收到一条错误消息,指出这在 Arm64 中是不可能的。

好的,我设置了条件build设置:MIN_DEPLOYMENT_TARGET 对于 Arm64 以外的架构是 5.0,但对于 Arm64 设置为 7.0。现在程序编译、链接和 lipos。但是现在,由于其中一个编译仅适用于 iOS 7.0,我收到一堆警告,提示我的程序包含对旧操作系统的调用。我知道。这是有意为之的——因此该程序将在那些较旧的系统上运行。在 iOS 7 系统上,这些旧例程不会被调用,相反,在运行时,程序会调用它们的现代替代例程。我可以让编译器停止提示:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
// old code here.
#pragma clang diagnostic pop

并且该程序在 iOS 7 设备(Armv7 和 Arm64)上运行良好。一些诊断代码可验证在 Arm64 设备上运行时,实际上正在使用 Arm64 分支。

在二进制报告上运行 lipo,它具有预期的架构。

但是,这是一个大错误:当我尝试在 iOS 5 设备上安装该应用程序时,Xcode 只是发出警告:“存在内部 API 错误。”

我认为 iOS 5 和 iOS 6 中存在错误,因此它们不会忽略来自 future 的分支。加载器应该简单地忽略它不识别的 fork 。但这不是它的工作方式。

Apple 永远不会修复 iOS 5。我认为当应用程序加载到设备上时,Apple 可能会解决这个问题:让 Xcode 去除不需要的分支,并重新签署(现在修改过的)二进制文件。同样,从 iTunes 下载可能会删除不需要的 fork 并重新签名。但苹果不太可能这样做:苹果希望所有能升级到 iOS7 的人。无法升级的 Apple 解决方案是:购买新硬件。

所以,我们被困住了。您可以在应用程序商店中拥有一个支持 5 和 6 的标题,并发布一个针对 7 的更新,即 fat armv7 和 arm64,这样您拥有 iOS7 的用户将获得 fat ,而拥有 5 或 6 的用户将获得旧的,但你只能做一次。发布 7 更新后,您将永远无法再更新 5 和 6 更新。

有解决办法吗?我想要一个在 Armv7 和 Arm64 上运行的程序,在 armv7 端运行 iOS 5 和 6,在不支持 arm64 的更硬的 armv7 上运行 iOS 7,在它支持的 iOS 7 arm64 上运行,怎么样?

最佳答案

无法在 iOS 5 上打开带有 64 位 slivers 的二进制文件。这是操作系统级别的限制,没有办法绕过它。一般来说,不再需要支持 iOS 5,但我确信某个地方的某个人有正当理由支持它,希望他们能找到这个问题。

如果您必须支持 iOS 5,则必须删除 64 位的条子。这不会阻止您的应用程序在 64 位系统上运行。它只是让它作为 32 位应用程序运行。大多数用户甚至不会注意到差异。

关于iphone - 如何制作可在 iOS 5 至 7 上运行的 armv7 arm64 fat 二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19482683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com