首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何创建可以在iOS 5到7上运行的armv7 arm64 fat二进制文件?

如何创建可以在iOS 5到7上运行的armv7 arm64 fat二进制文件?
EN

Stack Overflow用户
提问于 2013-10-21 04:47:35
回答 3查看 8.2K关注 0票数 4

多年来,苹果已经改变了指令集。由于单个程序可能需要在不止一种机器上运行,因此Apple使用由名为“lipo”的工具构建的“胖二进制文件”。您告诉Xcode多次编译您的程序,每种机器类型编译一次,然后lipo将它们绑定在一起。

苹果最近发布了第四套针对iOS的指令集。第一批手机使用Armv6,来自3GS,我们有Armv7,为Armv7s添加了一些新的指令,现在,5S增加了Arm64。

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

好的,我设置了一个条件构建设置:对于Arm64以外的体系结构,MIN_DEPLOYMENT_TARGET是5.0,但对于Arm64,它被设置为7.0。现在,程序进行编译、链接和Now。但现在,由于其中一个编译版本仅为iOS 7.0,我收到了一堆警告,指出我的程序包含对较旧操作系统的调用。我知道这个。这是故意的-所以程序将在那些较旧的系统上运行。在iOS 7系统上,这些旧的例程不会被调用,相反,在运行时,程序会调用它们的现代替代品。我可以让编译器停止抱怨:

代码语言:javascript
运行
复制
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
// old code here.
#pragma clang diagnostic pop

而且,该程序在Armv7和Arm64的iOS 7设备上运行良好。一小段诊断代码验证了在Arm64设备上运行时,是否实际使用了Arm64分支。

在二进制文件上运行lipo会报告其中包含预期的体系结构。

但是,这是一个很大的问题:当我试图在iOS 5设备上安装这个应用程序时,Xcode只是弹出了一个警告:“有一个内部API错误。”

我认为iOS 5和iOS 6中有一个bug,所以他们不会忽略来自未来的分支。加载器应该简单地忽略它无法识别的fork。但这不是它的工作方式。

苹果永远不会修复iOS 5。我认为苹果可能会在应用程序加载到设备上时解决这个问题:让Xcode剥离不需要的分支,并对(现在修改后的)二进制文件进行重新签名。类似地,从iTunes下载可能会剥离不需要的分支并重新签名。但苹果不太可能这么做:苹果希望每个有能力的人都升级到iOS7。对于那些无法升级的人,苹果的解决方案是:购买新硬件。

所以,我们被困住了。你可以在支持5和6的应用商店中有一个标题,然后发布一个针对7的更新,即fat armv7和arm64,这样拥有iOS7的用户将获得胖的,拥有5或6的用户将获得旧的,但你只能这样做一次。一旦你发布了7更新,你就再也不能更新5&6更新了。

有什么办法可以解决这个问题吗?我想要一个在Armv7和arm64上运行的程序,在armv7端运行iOS 5和6,在harder上运行armv7的iOS 7,它不是arm64和iOS 7 Arm64,它是如何支持的?

EN

回答 3

Stack Overflow用户

发布于 2013-10-21 05:09:11

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

如果您必须支持iOS 5,则必须删除64位版本。I这并不妨碍您的应用程序在64位系统上工作。它只是让它作为一个32位的应用程序运行。大多数用户甚至不会注意到其中的区别。

票数 8
EN

Stack Overflow用户

发布于 2013-10-21 06:07:32

从当前的Xcode版本( 5.0 (5A1412)版)开始:

注意:未来版本的Xcode将允许您创建支持iOS 6及更高版本上的32位运行时和iOS 7上的64位运行时的单个应用程序。Apple Source

票数 1
EN

Stack Overflow用户

发布于 2014-11-16 04:51:44

苹果在iOS 5.1中修复了这个问题,因此,如果你将最小部署目标设置为5.1,那么你可以生成一个32/64胖二进制文件,它将在5.1以上的版本中工作。我在5.1之前写了原始的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19482683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档