Xcode 5和iOS 7:架构和有效架构

时间:2013-09-20 09:57:48

标签: iphone ios xcode ios7

我正在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位架构?

enter image description here

6 个答案:

答案 0 :(得分:121)

将构建设置中的体系结构设置为 标准体系结构(armv7,armv7s)

enter image description here

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

答案 1 :(得分:7)

当您设置64位时,生成的二进制文件是" Fat"二进制,包含所有三个与薄脂肪标题捆绑在一起的Mach-O图像。你可以看到使用otool或jtool。您可以查看一些包含在iOS 7.0 SDK中的胖二进制文件,例如AVFoundation Framework,如下所示:

% 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),并且必须在低级指针处理方面做更多事情。编译器将实现其魔力和优化。

答案 2 :(得分:7)

我对Apple Docs的理解。

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

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

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

答案 3 :(得分:6)

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

即可

重要提示:您无法在构建设置部分中将部署目标设置为5.1.1,因为它只有固定值的下拉列表。但只需在文本字段中键入值,即可在应用程序设置的常规部分轻松将其设置为5.1.1。

答案 4 :(得分:5)

简单修复:

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

适用于使用iOS 9.3.3的设备

答案 5 :(得分:4)

没有任何答案有效,然后我忘记设置最低部署目标,可以在项目 - >中找到一般 - > 部署信息 - > 部署目标 - > 8.0

Example