82

我正在 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 项目 Build Settings和settings 有

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

在此处输入图像描述

4

6 回答 6

123

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

在此处输入图像描述

iPhone 5S 采用 A7 64 位处理器。来自苹果文档

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 在架构部分进行了重大更改。这个答案将是你的后续。 检查这个

于 2013-09-20T10:08:30.553 回答
9

我对 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 上运行。
于 2013-12-10T09:53:07.370 回答
6

When you set 64-bit the resulting binary is a "Fat" binary, which contains all three Mach-O images bundled with a thin fat header. You can see that using otool or jtool. You can check out some fat binaries included as part of the iOS 7.0 SDK, for example the AVFoundation Framework, like so:

% 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)

As for the binary itself, it uses the ARM64 bit instruction set, which is (mostly compatible with 32-bit, but) a totally different instruction set. This is especially important for graphics program (using NEON instructions and registers). Likewise, the CPU has more registers, which makes quite an impact on program speed. There's an interesting discussion in http://blogs.barrons.com/techtraderdaily/2013/09/19/apple-the-64-bit-question/?mod=yahoobarrons on whether or not this makes a difference; benchmarking tests have so far clearly indicated that it does.

Using otool -tV will dump the assembly (if you have XCode 5 and later), and then you can see the instruction set differences for yourself. Most (but not all) developers will remain agnostic to the changes, as for the most part they do not directly affect Obj-C (CG* APIs notwithstanding), and have to do more with low level pointer handling. The compiler will work its magic and optimizations.

于 2013-09-21T13:42:06.013 回答
6

通过从支持的架构中删除arm64设置,您无需将编译器限制为仅armv7armv7s 。您只需将部署目标设置设置为 5.1.1

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

于 2014-09-15T18:06:35.513 回答
5

简单修复:

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

适用于装有 iOS 9.3.3 的设备

于 2016-08-12T15:43:35.767 回答
4

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

例子

于 2016-05-30T07:57:13.917 回答