文档章节

Xcode的Architectures和Valid Architectures的区别,以及st...

shede333
 shede333
发布于 2013/10/29 21:07
字数 1529
阅读 12623
收藏 11

作者:shede333
主页:http://my.oschina.net/shede333
版权声明:原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0


##Xcode的Architectures和Valid Architectures的区别

###Architectures

这代表,在这个项目里你想要Xcode编译的目标设备列表。

###Valid Architectures

还不是太明确这个设置的意图,但是一般来说是不需要更改的。


在Xcode5.0里的Valid Architectures 设置里,有2个选项:

  1. 默认为standard architectures (including 64-bit)(armv7,armv7s,arm64),这样设置,你的Deployment target最低只能设置为 6.0,(在Xcode5.0.1 之后,最低能够兼容IOS 5.1.1);
  2. standard architectures (armv7,armv7s),这样设置,你的Deployment target最低能设置为 4.3;

##原因解释如下:

使用**standard architectures (including 64-bit)(armv7,armv7s,arm64)**参数, 则打的包里面有32位、64位两份代码, 在iPhone5s(iPhone5s的cpu是64位的)下,会首选运行64位代码包, 其余的iPhone(其余iPhone都是32位的,iPhone5c也是32位), 只能运行32位包, 但是包含两种架构的代码包,只有运行在ios6,ios7系统上。 这也就是说,这种打包方式,对手机几乎没啥要求,但是对系统有要求,即ios6以上。

而使用**standard architectures (armv7,armv7s)**参数, 则打的包里只有32位代码, iPhone5s的cpu是64位,但是可以兼容32位代码,即可以运行32位代码。但是这会降低iPhone5s的性能,原因下面的参考有解释。
其余的iPhone对32位代码包更没问题, 而32位代码包,对系统也几乎也没什么限制。

所以总结如下:
要发挥iPhone5s的64位性能,就要包含64位包,那么系统最低要求为ios6。
如果要兼容ios5以及更低的系统,只能打32位的包,系统都能通用,但是会丧失iPhone5s的性能。


##参考1:

###所有IOS设备详情列表 List of iOS devices - Wikipedia, the free encyclopedia

armv6:iPhone 2G/3G,iPod 1G/2G
armv7:iPhone 3GS/4/4s,iPod 3G/4G,iPad 1G/2G/3G ,iPad Mini 1 armv7s:iPhone5 ,iPhone5C ,iPad4 armv8:iPhone5S ,iPad5(iPad Air), iPad Mini 2(iPad Mini Retina)


##参考2:

###iOS 7: 如何为iPhone 5S编译64位应用。

Xcode 5编译的iOS 7程序包含了32位和64位两套二进制代码,在32位的iOS系统上会调用32位的二进制代码,在64位系统上会调用64位的二进制代码,以此来解决向后兼容的问题。

同时,考虑到很多32位的程序可能在没有重新编译的情况下部署到64位系统上,64位的iOS系统中带有两套FrameWork,一套是32位的,一套是64位的。 当64位的iOS系统运行原来的32位程序时,系统会调用32位的FrameWork作为底层支撑,当系统运行64位程序时,系统会调用64位的FrameWork作为底层支撑。

也就是说,当一个iPhone 5S上同时运行32位程序和64位程序时,系统同时将32位和64位两套FrameWork载入了内存中,所以消耗的内存也比较多。

如果一台64位的iOS设备上运行的所有程序都是为64位系统编译过的,iOS系统将只载入64位的FrameWork,这将节省好多内存。所以,如果大家都可以快速将程序传换成64位的,iOS将跑得更快。真的是“大家好才是真的好”。


##参考3:

###What's the difference between “Architectures” and “Valid Architectures” in Xcode Build Settings?

Architectures are the ones you want to build, valid architectures are the ones you could conceive of building with your codebase.

So maybe you only want to build your binary for armv7s, but the same source code would compile fine for armv7 and armv6. So VALID_ARCHS = armv6 armv7 armv7s, but you set ARCHS = armv7s because that's all you actually want to build with your code.

Or, in Apple-ese:

ARCHS (Architectures)

Space-separated list of identifiers. Specifies the architectures (ABIs, processor models) to which the binary is targeted. When this build setting specifies more than one architecture, the generated binary may contain object code for each of the specified architectures.

and:

VALID_ARCHS (Valid Architectures)

Space-separated list of identifiers. Specifies the architectures for which the binary may be built. During the build, this list is intersected with the value of ARCHS build setting; the resulting list specifies the architectures the binary can run on. If the resulting architecture list is empty, the target generates no binary.

Source: Xcode Build Setting Reference

In practice, you leave VALID_ARCHS alone and don't worry about changing it, and just fiddle with ARCHS to set the architectures you want to build. Typically, you set a Debug build to just NATIVE_ARCH, since you only want to build the debug version for the machine you'll be testing/running it on, and Release builds for the full spectrum of architectures you plan to support.


##参考4:

###Xcode 5 and iOS 7: Architecture and Valid architectures

Set the architecture in build setting to Standard architectures(armv7,armv7s)

enter image description here

iPhone 5S is powered by A7 64bit processor. From apple docs

Xcode can build your app with both 32-bit and 64-bit binaries included. This combined binary requires a minimum deployment target of iOS 7 or later.

Note: A future version of Xcode will let you create a single app that supports the 32-bit runtime on iOS 6 and later, and that supports the 64-bit runtime on iOS 7.

From the documentation what i understood is

  • Xcode can create both 64bit 32bit binaries for a single app but the deployment target should be iOS7. They are saying in future it will be iOS 6.0
  • 32 bit binary will work fine in iPhone 5S(64 bit processor).

Update (Xcode 5.0.1)
In Xcode 5.0.1 they added the support to create 64 bit binary for iOS 5.1.1 onwards.

Xcode 5.0.1 can build your app with both 32-bit and 64-bit binaries included. This combined binary requires a minimum deployment target of iOS 5.1.1 or later. The 64-bit binary runs only on 64-bit devices running iOS 7.0.3 and later.

Update (Xcode 5.1)
Xcode 5.1 made significant change in the architecture section. This answer will be a followup for you. Check this


##参考5:

###how to stop xcode5.1 building for 64bit

OP is posted the solution along with the question itself. But I feel it would be better to add it as an answer. In Xcode 5.1 apple made significant changes to the architecture section. They made arm64 as part of Standard architectures. That means the projects using the default setting will be automatically build for arm64 also. So what you will do if your app does not support arm64?.

Doc says:

Projects not able to support 64-bit need to specifically set the architectures build setting to not include 64-bit.

How to do that?

  1. Goto Targets-->Build Settings-->Architectures-->Architectures

  2. Double click on the architecture will popup a menu. Choose others

enter image description here

  1. Delete the existing row - $(ARCH_STANDARD). Add the required architectures one by one

enter image description here

  1. Now your architecture section will look like this

enter image description here


##参考6:

###1. Xcode Build Setting Reference (苹果官方文档)

###2. 64-Bit transition Guide for Cocoa Touch (苹果官方文档)

###3. Xcode设置项之Architectures和Valid Architectures

© 著作权归作者所有

shede333
粉丝 21
博文 24
码字总数 34707
作品 0
海淀
程序员
私信 提问
加载中

评论(1)

xuqee
xuqee
mark
Xcode4.5中Architectures中的Architectures和Valid Architectures的区别

Architectures are the ones you want to build, valid architectures are the ones you could conceive of building with your codebase. So maybe you only want to build your binary for......

江山风雨
2018/07/04
0
0
NO architectures to compile for (ONLY_ACTIVE_ARCH=YES,active arch=x86_64,

运行程序出错,首先确定是否运行设备出错。 error: missing required architecture x86_64 in file 解决方案如下: targets ->build setting 下的 architectures 设置为 standard architetu...

水一样的人儿
2016/08/16
42
0
Apple移动设备默认指令集

armv6 设备: iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch armv7 设备: iPhone3GS, iPhone4, iPhone4S iPad, iPad2, iPad3(The New iPad), iPad mini iPod Touch 3G, iPod Touch......

robslove
2015/09/09
184
0
Apple移动设备处理器指令集 armv6、armv7、armv7s及arm64

一、概要 平时项目开发中,可能使用第三方提供的静态库.a,如果.a提供方技术不成熟,使用的时候就会出现问题,例如: 在真机上编译报错:No architectures to compile for (ONLYACTIVEARCH=Y...

SunGiantor
2015/05/20
121
0
Xcode的Architectures和Valid Architectures的区别

Architectures 这代表,在这个项目里你想要Xcode编译的目标设备列表。 Valid Architectures 还不是太明确这个设置的意图,但是一般来说是不需要更改的。 在Xcode5.0里的Valid Architectures...

南瓜宝宝
2015/04/15
299
0

没有更多内容

加载失败,请刷新页面

加载更多

spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
3分钟前
0
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
6
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
8
0
详解箭头函数和普通函数的区别以及箭头函数的注意事项、不适用场景

箭头函数是ES6的API,相信很多人都知道,因为其语法上相对于普通函数更简洁,深受大家的喜爱。就是这种我们日常开发中一直在使用的API,大部分同学却对它的了解程度还是不够深... 普通函数和...

OBKoro1
昨天
7
0
轻量级 HTTP(s) 代理 TinyProxy

CentOS 下安装 TinyProxy yum install -y tinyproxy 启动、停止、重启 # 启动service tinyproxy start# 停止service tinyproxy stop# 重启service tinyproxy restart 相关配置 默认...

Anoyi
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部