Xcode 5和iOS 7:体系结构和有效的体系结构
我正在Xcode 5中开始新的项目。我想用iOS SDK 7
开发应用程序,但部署目标iOS 5.0
。 只要我在Xcode中创build新的项目,并尝试将部署目标更改为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
(没有64bit)。 我编译,运行,但我真的不明白刚刚发生的事情。
Xcode项目构build设置中的Valid architectures
Architectures
和Valid architectures
设置有什么区别?
如果我设置Architectures
来排除64位在64位iPhone或iOS模拟器上运行我的应用程序时发生了什么(我知道它可行,我只是好奇底下是什么)?
你能解释一下新的64位架构大混乱吗?
将构build设置中的体系结构设置为标准体系结构(armv7,armv7s)
iPhone 5S由A7 64位处理器驱动。 从苹果文档
Xcode可以构build你的应用程序,包括32位和64位二进制文件。 这个组合的二进制文件需要iOS 7或更高版本的最低部署目标。
注意:将来的Xcode版本将允许您创build一个支持iOS 6及更高版本的32位运行时的应用程序,并支持iOS 7上的64位运行时。
从我所了解的文件是
- Xcode可以创build一个单一的应用程序的64位32位二进制文件,但部署目标应该是iOS7。 他们说未来会是iOS 6.0
- 在iPhone 5S(64位处理器)中,32位二进制可以正常工作。
更新(Xcode 5.0.1)
在Xcode 5.0.1中,他们添加了为iOS 5.1.1以上版本创build64位二进制文件的支持。
Xcode 5.0.1可以构build你的应用程序,包括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位,但是)完全不同的指令集。 这对graphics程序(使用NEON指令和寄存器)尤其重要。 同样,CPU有更多的寄存器,这对编程速度有相当大的影响。 在http://blogs.barrons.com/techtraderdaily/2013/09/19/apple-the-64-bit-question/?mod=yahoobarrons上有一个有趣的讨论,究竟这是否有所作为; ; 基准testing迄今已清楚地表明,它确实如此。
使用otool -tV将转储程序集(如果您有XCode 5和更高版本),然后您可以看到自己的指令集差异。 大多数(但不是全部)开发人员对这些改变仍然不知情,因为大部分开发人员不会直接影响Obj-C(尽pipeCG * API),并且必须在低级指针处理方面做更多的工作。 编译器将会发挥它的魔力和优化。
我对Apple Docs的理解。
- 什么是体系结构 (ARCHS)到Xcode生成设置?
- 指定二进制文件的目标结构。 当多指定一个体系结构时,生成的二进制文件可能包含每个指定体系结构的目标代码。
-
什么是有效的体系结构 (VALID_ARCHS)到Xcode的生成设置?
- 指定可能构build二进制文件的体系结构。
- 在构build过程中,此列表与ARCHS相交,结果列表指定二进制可以运行的体系结构。
-
例如: – 一个iOS项目具有以下构build设置到Xcode中。
- ARCHS = armv7 armv7s
- VALID_ARCHS = armv7 armv7s arm64
- 在这种情况下,二进制将为armv7 armv7s arm64架构而构build。 但相同的二进制文件只能在ARCHIV = armv7 armv7s上运行。
你不需要通过从支持的体系结构中删除arm64设置来限制你的编译器只有armv7和armv7s 。 您只需要将部署目标设置设置为5.1.1
重要说明:您无法在“ 生成设置”部分中将“部署目标”设置为5.1.1,因为它仅在固定值下拉列表中。 但只需在文本框中input值,就可以在应用程序设置的常规部分轻松地将其设置为5.1.1。
简单的修复:
目标 – >生成设置 – >生成选项 – >启用位码 – >没有
适用于iOS 9.3.3的设备
没有答案的工作,然后我忘了设置最小部署目标,可以在项目 – > 常规 – > 部署信息 – > 部署目标 – > 8.0