繁体   English   中英

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

[英]Xcode 5 and iOS 7: Architecture and Valid architectures

我正在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项目构建设置中的Valid architectures ArchitecturesValid architectures设置之间有什么区别?
如果我将Architectures设置为排除64位当我在64位iPhone或iOS模拟器上运行我的应用程序时会发生什么(我知道它有效,我只是好奇下面有什么问题)?
你能用新的64位架构来解释大混乱吗?

在此输入图像描述

将构建设置中的体系结构设置为标准体系结构(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在架构部分做了重大改变。 这个答案将是您的后续跟进。 检查一下

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

我对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上运行。

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

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

简单修复:

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

适用于iOS 9.3.3的设备

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

例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM