如何使用iOS 5为armv6和armv7架构构建


96

iOS5中, Apple 从ARCHS_STANDARD_32_BIT中删除了armv6架构。

为了保持对iPhone3G的支持,即使在iOS5中,我仍然想在armv6中进行编译。

有人找到解决方案了吗?

Answers:


96

我今天刚刚构建了一些东西,指定了iOS 4.0的部署目标。在仅在Architectures中指定armv7的情况下,Xcode警告我,要支持iOS4.2以下的任何内容,我必须在Architectures中包括armv6。只需编辑该字段,在对话框弹出时单击“ +”按钮,然后输入文字“ armv6”。

就我而言,我们希望我们的应用程序可以在iOS4和iOS5下运行。我们必须进行一些修改,才能在iOS5下正常工作,但是所有这些更改都是通过对iOS4友好的代码更改完成的。

我们还以某种方式添加了一些特定于iOS5的功能,该功能允许该应用在iOS4下运行而不会崩溃。具体来说,我们在尝试使用iOS5功能之前进行了测试,并将仅iOS5的库链接为可选。

因此,在iOS5世界中支持iPhone3G可能就很容易意味着“我们希望我们的应用程序在iOS4及更高版本上运行(无论使用任何iOS5功能)”,而不是“我们希望确保我们的应用程序在运行iOS5的旧设备上运行”。这里有所不同;考虑一下。:-)

无论如何,重新添加armv6支持非常容易。我猜的意思是:在某个时刻,当不再有armv6设备在那里(不必担心)时,您不必为此而构建。苹果公司认为,每个人都应尽快升级到最新的硬件。因此,在那个世界中,除了最新和最强大的工具外,也不需要默认任何工具。:-)幸运的是(或没有),我们的开发人员生活在现实世界中,并且意识到您必须在一段时间内支持较旧的东西。我想Xcode开发团队也知道这一点,这就是为什么您可以很简单地添加armv6支持的原因。


3
感谢您的精确回答:-)确实,我希望能够在iOS 4.2.1或更低版本(限制为4.0)的iPhone 3G上运行我的应用程序,并为当前设备提供一些iOS 5特定功能。我没有尝试在体系结构中简单地添加“ armv6”,而是在寻找诸如ARCHS_STANDARD_32_BIT之类的环境变量,但我刚刚发现ARCHS_UNIVERSAL_IPHONE_OS,但它似乎没有用。
iGranDav 2011年

3
想要补充的是,许多解决方案建议它应该显示“ armv6 armv7”-这对我不起作用。目前只有“ armv6 $(ARCHS_STANDARD_32_BIT)”对我有用,这意味着不要摆脱那里的内容,只需将“ armv6”添加到“架构”设置中
布拉克(Brack)2011年

1
我做了所有这些工作,但我的构建仍然失败-原因是我将(未使用的)Release构建设置为iOS 5.0的部署目标,而Debug和Distribution设置为3.0,这似乎停止了armv6的xcode构建。将所有版本的Deployment target设置为3.0可以解决此问题。
西蒙·伊斯特

6
它对我不起作用(即使添加了“ armv6”之后)。该应用程序甚至都没有出现在我的iPod touch上。但是后来我发现“必需的设备功能”(在信息选项卡下)中有armv7。我刚刚删除了它,它开始正常运行
Erpheus

1
我通常使用$(VALID_ARCHS),它对我有用。我刚刚发现,新项目还添加了功能要求“ arm7”。我只是删除了,一切正常。
Gordon Dove 2012年

51

简单的答案是,您必须将当前设置从“标准(armv7)-$(ARCHS_STANDARD_32_BIT)”更改为“ armv6”和“ armv7”。参见下图。您必须先删除具有先前设置的行,然后才能使用它。

正确设置armv6和armv7


3
感谢您用图片进行解释-确实很清楚。
radven

11

还请确保您在“项目和目标”中进行了设置...花了我一个小时才能弄清楚。将它设置为一个,但没有另一个。希望这可以帮助。GLTA


另外,如果您有任何库,则必须在项目中设置它并在其中定位目标。
William Jockusch

9

我认为Apple从标准设置中删除armv6是有原因的。

我已经使用iOS5 SDK编译了armv7 / armv6,但是armv6编译器在发布模式下生成了错误的代码。在寻找解决方法数小时后(尝试使用不同的优化级别尝试llvm或gcc),我放弃了。

因此,只要支持较旧的armv6设备,我就会回到iOS SDK4.x。

代码示例:

// myView center=(160, 100)
CGPoint p=myView.center;  
// now p=(100,100) (what the heck?)
p.x=myView.center.x;
p.y=myView.center.y;
// now p=(160,100) 
p.y+=100;
// now p =(200,200) (what the heck?)

也许我有一些内存损坏,但是,在armv7编译器和iOSSDK <5.0上,它的行为符合预期。

最好的祝福


我还看到armv6的奇怪错误是在较旧的设备上构建的。您确定了这一点,还是真的回到了以前的XCode?我还要注意,他们不允许您再下载旧的SDK!
克雷格·麦克马洪

19
这是Xcode 4.2和CGPoint / CGSize结构中的LLVM编译器3.0的一个已知问题:devforums.apple.com/thread/122059 ? tstart= 15。在armv6上禁用Thumb的构建可防止此类错误。
布拉德·拉尔森

哇!我很高兴您的回答,这也在我身上发生。
Clafou 2011年

7

不确定这是否真的是一种解决方案,但是我发现用“ armv6 armv7”替换“ architectures”中的已定义字符串$(ARCHS_STANDARD_32_BIT),使我可以将iOS5作为基础并以iOS4作为部署进行编译定位并通过验证。

我没有使用任何IOS5专有的库或调用,但是打算在下一个版本中使用。


1

我不需要用armv7替换$(ARCHS_STANDARD_32_BIT)即可编译应用程序并将其上传到App Store。

正如MarkGranoff所建议的那样,我只需将armv6添加为纯文本,只需点击加号并在第二行中键入它即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.