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

82

我在Xcode 5中开始了一个新项目。我想使用来开发应用程序,但是将部署目标设置为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


你有没有在苹果开发者论坛上看过?那里有很多关于这个问题的帖子。https://devforums.apple.com/message/887506#887506 - trojanfoe
6个回答

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

enter image description here

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在体系结构部分进行了重大改变。这个answer将是您的后续。Check this

正如我在问题中所写的那样,我已经完成了它。我的问题更多地是关于它改变了什么以及底层发生了什么。 - Crazy Yoghurt
关于编辑:所以只是关于包含的二进制文件吗?将架构设置为排除64位,iPhone 5S将运行32位二进制文件? - Crazy Yoghurt
关于编辑:我认为最低部署目标必须是iOS 6.0,而不是iOS 7.0。@CrazyYoghurt 是的,就像Mac一样-64位机器可以运行32位二进制文件,否则64位机器在首次引入时将无法运行任何内容。 - trojanfoe
目前要在5s和其他iOS7设备上运行应用程序,部署目标应为iOS 7.0。 - Anil Varghese
3
那么你必须放弃 arm64 - trojanfoe
显示剩余7条评论

9

根据苹果文档的理解。

  • 架构(ARCHS)是什么,它在Xcode中的build-settings中有什么作用?
    • 指定要将二进制文件针对的架构。当指定多个架构时,生成的二进制文件可能包含每个指定架构的对象代码。
  • 有效架构(VALID_ARCHS)是什么,它在Xcode中的build-settings中有什么作用?

    • 指定可以构建该二进制文件的架构。
    • 在构建过程中,此列表与ARCHS相交,得到的列表指定了可以运行该二进制文件的架构。
  • 例子:一个iOS项目在Xcode中有以下build-settings。

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

9
不,我还是很困惑 :S - Ade
“resulting list” 是什么? - DanMoore
@DanMoore 集合交集的结果。 - Slipp D. Thompson
2
如果我能找到一个理由,为一个我不想运行的架构构建应用程序就有意义了。 - rob5408

6

当你设置为64位时,生成的二进制文件是一个“Fat”二进制文件,其中包含了所有三个与薄的fat头一起打包的Mach-O映像。你可以使用otool或jtool查看它。例如,您可以检查iOS 7.0 SDK中包含的一些Fat二进制文件,比如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中有一场有趣的讨论,关于这是否会产生影响;到目前为止,基准测试清楚地表明确实会产生影响。

如果您有XCode 5及以上版本,使用otool -tV将转储汇编代码,然后您可以自己看到指令集之间的差异。大多数(但不是全部)开发人员会对这些变化保持中立态度,因为它们在很大程度上不直接影响Obj-C(CG* APIs除外),而与低级指针处理有关。编译器会进行优化处理。


6
您不需要通过从支持的体系结构中移除arm64设置来限制编译器仅支持armv7和armv7s。您只需将“部署目标”设置为5.1.1即可。
重要提示:您无法在“构建设置”部分将“部署目标”设置为5.1.1,因为它只是一个下拉菜单,只有固定值可供选择。但您可以在应用程序设置的“常规”部分中轻松地将其设置为5.1.1,只需在文本字段中键入该值即可。

5

简单的解决方法:

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

适用于安装了iOS 9.3.3的设备。


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

Example


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接