【问题标题】:Xcode 5 and iOS 7: Architecture and Valid architecturesXcode 5 和 iOS 7:架构和有效架构
【发布时间】:2013-09-25 16:08:48
【问题描述】:

我正在 Xcode 5 中启动新项目。我想使用 iOS SDK 7 开发应用程序,但部署目标为 iOS 5.0。一旦我在 Xcode 中创建新项目并尝试将部署目标更改为 5.0,我就会收到以下消息:

Applications including an arm64 slice are not compatible with versions of iOS
prior to 6.0
Adjust your Architectures build setting to not include arm64 in order to deploy
to releases prior to iOS 6.0.

因此将架构更改为Standard(无 64 位)。我编译、运行,但我不太明白刚刚发生了什么。

Xcode 项目构建设置中的ArchitecturesValid architectures 设置有什么区别?
如果我将Architectures 设置为排除64 -当我在 64 位 iPhone 或 iOS 模拟器上运行我的应用程序时会发生什么(我知道它可以工作,我只是好奇下面会发生什么)?
你能解释一下新的 64 位架构造成的大混乱吗?

【问题讨论】:

标签: iphone ios xcode ios7


【解决方案1】:

将构建设置中的架构设置为标准架构(armv7,armv7s)

iPhone 5S 搭载 A7 64 位处理器。来自apple docs

Xcode 可以构建包含 32 位和 64 位二进制文​​件的应用程序。此组合二进制文件需要 iOS 7 或更高版本的最低部署目标。

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

从文档中我理解的是

  • Xcode 可以为单个应用创建 64 位和 32 位二进制文​​件,但 部署目标应该是 iOS7。他们说将来会 是iOS 6.0
  • 32 位二进制可以在 iPhone 5S(64 位处理器)上正常工作。

更新(Xcode 5.0.1)
在 Xcode 5.0.1 中,他们添加了为 iOS 5.1.1 及更高版本创建 64 位二进制文​​件的支持。

Xcode 5.0.1 可以构建包含 32 位和 64 位二进制文​​件的应用程序。此组合二进制文件需要 iOS 5.1.1 或更高版本的最低部署目标。 64 位二进制文​​件只能在运行 iOS 7.0.3 及更高版本的 64 位设备上运行。

更新(Xcode 5.1)
Xcode 5.1 在架构部分进行了重大更改。这个answer 将是你的后续行动。 Check this

【讨论】:

  • 正如我在问题中所写的,我已经完成了。我的问题更多是关于它发生了什么变化以及下面发生了什么。
  • 关于编辑:所以它只是包含二进制文件?将架构设置为排除 64 位,iPhone 5S 将运行 32 位二进制?
  • 关于编辑:我认为最低部署目标必须是iOS 6.0,而不是iOS 7.0。 @CrazyYoghurt 是的,与 Mac 一样 - 64 位机器可以运行 32 位二进制文​​件,否则 64 位机器在首次引入时将无法运行。
  • 目前可以在5s和其他iOS7设备上运行应用,目标应该是iOS 7.0
  • @CrazyYoghurt 那么你必须放弃arm64
【解决方案2】:

我对 Apple Docs 的理解。

  • Xcode 构建设置中的架构 (ARCHS) 是什么?
    • 指定二进制文件目标的架构。当指定多个架构时,生成的二进制文件可能包含每个指定架构的目标代码。
  • Xcode 构建设置中的有效架构 (VALID_ARCHS) 是什么?

    • 指定二进制文件可能BUILT的架构。
    • 在构建过程中,此列表与 ARCHS 相交,生成的列表指定二进制文件可以运行的架构。
  • 示例:- 一个 iOS 项目在 Xcode 中具有以下构建设置。

    • ARCHS = armv7 armv7s
    • VALID_ARCHS = armv7 armv7s arm64
    • 在这种情况下,将为 armv7 armv7s arm64 架构构建二进制文件。但相同的二进制文件只能在 ARCHS = armv7 armv7s 上运行。

【讨论】:

  • 不,仍然让我感到困惑:S
  • 什么是“结果列表”??
  • @DanMoore set intersection 的结果。
  • 如果我能找到一个理由来构建我不想在其上运行的架构,那将是有意义的。
【解决方案3】:

当您设置为 64 位时,生成的二进制文件是“胖”二进制文件,其中包含所有三个 Mach-O 图像,并与一个瘦胖头文件捆绑在一起。您可以使用 otool 或 jtool 来查看。您可以查看一些包含在 iOS 7.0 SDK 中的胖二进制文件,例如 AVFoundation 框架,如下所示:

% cd  /Developer/Platforms/iPhoneOS.platform/DeviceSupport/7.0\ \(11A465\)/Symbols/System/Library/Frameworks/AVFoundation.framework/

%otool -V -f AVFoundation                                                                     9:36
Fat headers
fat_magic FAT_MAGIC
nfat_arch 3
architecture arm64     # The 64-bit version (A7)
    cputype CPU_TYPE_ARM64
    cpusubtype CPU_SUBTYPE_ARM64_ALL
    capabilities 0x0
    offset 16384
    size 2329888
    align 2^14 (16384)
architecture armv7        # A5X - packaged after the arm64version
    cputype CPU_TYPE_ARM
    cpusubtype CPU_SUBTYPE_ARM_V7
    capabilities 0x0
    offset 2359296
    size 2046336
    align 2^14 (16384)
architecture armv7s       # A6 - packaged after the armv7 version
    cputype CPU_TYPE_ARM
    cpusubtype CPU_SUBTYPE_ARM_V7S
    capabilities 0x0
    offset 4407296
    size 2046176
    align 2^14 (16384)

至于二进制本身,它使用 ARM64 位指令集,它(大部分与 32 位兼容,但是)完全不同的指令集。这对于图形程序(使用 NEON 指令和寄存器)尤其重要。同样,CPU 有更多的寄存器,这对程序速度有很大影响。 http://blogs.barrons.com/techtraderdaily/2013/09/19/apple-the-64-bit-question/?mod=yahoobarrons 有一个有趣的讨论,关于这是否会有所作为;到目前为止,基准测试已经清楚地表明确实如此。

使用 otool -tV 将转储程序集(如果您有 XCode 5 及更高版本),然后您可以自己查看指令集差异。大多数(但不是全部)开发人员将保持对这些更改的不可知论,因为在大多数情况下,他们不会直接影响 Obj-C(尽管有 CG* API),并且必须在低级指针处理方面做更多事情。编译器将发挥它的魔力和优化功能。

【讨论】:

    【解决方案4】:

    您不需要通过从支持的架构中删除 arm64 设置来将编译器限制为仅 armv7armv7s。 您只需将 Deployment target 设置为 5.1.1

    重要提示:您不能在 Build Settings 部分将部署目标设置为 5.1.1,因为它是仅具有固定值的下拉菜单。但您只需在文本字段中输入值即可在应用程序设置的常规部分轻松将其设置为 5.1.1。

    【讨论】:

      【解决方案5】:

      简单修复:

      目标 -> 构建设置 -> 构建选项 -> 启用位码 -> 否

      适用于装有 iOS 9.3.3 的设备

      【讨论】:

        【解决方案6】:

        没有一个答案有效,然后我忘记设置可以在 Project -> General -> Deployment Info 中找到的最小部署目标strong> -> 部署目标 -> 8.0

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-23
          • 2013-11-28
          • 1970-01-01
          • 2011-11-21
          • 2014-08-13
          • 1970-01-01
          • 1970-01-01
          • 2016-05-14
          相关资源
          最近更新 更多