【问题标题】:How to build for armv6 and armv7 architectures with iOS 5如何使用 iOS 5 构建 armv6 和 armv7 架构
【发布时间】:2011-11-21 06:22:39
【问题描述】:

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

为了保持对iPhone3G的支持,我还是想在armv6中编译,即使是iOS5。

有人找到解决方案了吗?

【问题讨论】:

    标签: ios ios5


    【解决方案1】:

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

    在我的例子中,我们希望我们的应用在 iOS4 和 iOS5 下运行。我们必须进行一些修改,使其能够在 iOS5 下正常工作,但所有这些更改都是通过对 iOS4 友好的代码更改完成的。

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

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

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

    【讨论】:

    • 感谢您的准确回答 :-) 实际上,我希望能够在 iOS 4.2.1 或更低版本(限制为 4.0)的 iPhone 3G 上运行我的应用程序,并具有一些 iOS 5 特定功能对于当前设备。我没有尝试在架构中简单地添加“armv6”,我正在寻找像 ARCHS_STANDARD_32_BIT 这样的环境变量,我刚刚找到了 ARCHS_UNIVERSAL_IPHONE_OS 但它似乎没有用。
    • 想补充一点,很多解决方案建议它应该说“armv6 armv7”——这对我不起作用。目前只有“armv6 $(ARCHS_STANDARD_32_BIT)”对我有用,这意味着不要摆脱那里的东西,只需将“armv6”添加到架构设置中
    • 我做了所有这一切,但我的构建仍然失败 - 原因是我有一个(未使用的)发布构建设置为 iOS 5.0 的部署目标,而调试和分发设置为 3.0,这似乎停止为 armv6 构建 xcode。将所有构建的部署目标设置为 3.0 解决了该问题。
    • 它对我不起作用(即使添加了“armv6”)。该应用程序甚至没有出现在我的 iPod touch 上。但后来我发现“必需的设备功能”(在信息选项卡下)里面有 armv7。我刚刚删除它,它开始完美运行
    • 我通常使用 $(VALID_ARCHS),它对我有用。我刚刚发现新项目还添加了功能要求“arm7”。我刚刚删除了它,一切正常。
    【解决方案2】:

    不确定这是否真的是一个解决方案,但我发现将“架构”中定义的字符串 $(ARCHS_STANDARD_32_BIT) 替换为“armv6 armv7”允许我以 iOS5 作为基础和 iOS4 进行编译作为部署目标,并通过验证。

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

    【讨论】:

      【解决方案3】:

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

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

      所以,只要我支持较旧的 armv6 设备,我就会回到 iOS SDK 4.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

      最好的问候

      【讨论】:

      • 我还在旧设备上的 armv6 版本中看到了奇怪的错误。您是否发现了这一点,或者真的回到了早期的 XCode?另外我注意到他们不再让你下载旧的 SDK!
      • 这是 Xcode 4.2 和 CGPoint / CGSize 结构中的 LLVM 编译器 3.0 的一个已知问题:devforums.apple.com/thread/122059?tstart=15。在 armv6 上禁用 Thumb 构建可防止此类错误。
      • 哇!我很高兴你的回答,这也发生在我身上。
      【解决方案4】:

      简单的答案是您必须将当前设置从“Standard (armv7) - $(ARCHS_STANDARD_32_BIT)”更改为“armv6”和“armv7”。见下图。您必须删除具有先前设置的行才能使其正常工作。

      【讨论】:

      • 感谢您用图片解释这一点 - 它真的很清楚。
      【解决方案5】:

      还要确保您在项目和目标中进行了设置……我花了一个小时才弄清楚这一点。已将其设置为一个但不是另一个。希望这可以帮助。 GLTA

      【讨论】:

      • 另外,如果你有任何库,你必须在项目和目标中设置它。
      【解决方案6】:

      我不需要将 $(ARCHS_STANDARD_32_BIT) 替换为 armv7 即可编译并上传到 App Store。

      按照 MarkGranoff 的建议,我只是将 armv6 添加为纯文本,方法是点击加号,然后在第二行输入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-23
        • 1970-01-01
        • 2012-07-25
        • 1970-01-01
        • 2018-01-26
        相关资源
        最近更新 更多