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


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项目构建设置中的和设置

之间有什么区别?如果我设置为排除64位,那么当我在64位iPhone或iOS Simulator上运行我的应用程序时会发生什么(我知道它可以工作,我只是好奇下面发生了什么)?您能用新的64位体系结构解释大麻烦吗?ArchitecturesValid architectures
Architectures

在此处输入图片说明


您是否看过苹果开发者论坛?关于此有很多帖子。devforums.apple.com/message/887506#887506
trojanfoe13年

Answers:


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在体系结构部分进行了重大更改。该答案将为您提供后续服务。 检查一下


正如我在问题中所写的那样,我已经做到了。我的问题更多是关于它会发生什么变化以及其下会发生什么。
疯狂的酸奶

关于编辑:就是关于包含的二进制文件?如果将Architecture设置为排除64位,iPhone 5S将运行32位二进制文​​件吗?
疯狂的酸奶

关于编辑:我认为最低部署目标必须是iOS 6.0,而不是iOS 7.0。@CrazyYoghurt是的,与Mac一样-64位计算机可以运行32位二进制文​​件,否则64位计算机在首次引入时将无任何运行。
trojanfoe

当前可以在5s和其他具有iOS7部署目标的设备上运行的应用程序应该是iOS 7.0
Anil Varghese

3
@CrazyYoghurt然后您必须放下arm64
trojanfoe

9

我对Apple Docs的理解。

  • Xcode构建设置中的架构(ARCHS)是什么?
    • 指定体系结构/ s到该二进制靶向。如果指定了一个以上的体系结构,则生成的二进制文件可能包含每个指定体系结构的目标代码。
  • Xcode构建设置中的有效架构(VALID_ARCHS)是什么?

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

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

9
不,仍然让我感到困惑:S
Ade 2014年

什么是“结果列表”?
DanMoore 2014年

@DanMoore设置相交的结果。
斯利普D.汤普森2014年

2
如果我能找到为我不想在其上运行的架构进行构建的理由,那将是有道理的。
rob5408 '16

6

当您设置64位时,生成的二进制文件是“胖”二进制文件,其中包含捆绑有瘦胖头的所有三个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),并且必须在低级指针处理上做更多的事情。编译器将发挥其魔力和优化作用。


6

您无需通过从受支持的体系结构中删除arm64设置来将编译器限制为仅armv7armv7。您只需要将“部署目标”设置设置为5.1.1

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


5

简单修复:

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

在装有iOS 9.3.3的设备上工作


4

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

例

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.