xcode工程编译错误:No architectures to compile for
Posted 梁飞宇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xcode工程编译错误:No architectures to compile for相关的知识,希望对你有一定的参考价值。
问题
开发环境:xcode6,iPhone6模拟器
xcode工程编译错误:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).
原因
导致这个错误的原因主要是CPU的编译架构引起的,Build Active Architecture Only属性设置为了YES(只编译当前模拟器指令集),当出现不兼容设备时就会出现错误。
解决
在工程Build Settings,设置Build Active Architecture Only属性设置为NO,并且Architectures与Valid Architectures属性分别添加ARMv7,ARMv7s,ARM64值,clear工程,重新build即可。
首先我们先了解一下各类型iOS设备的架构:
ARMv8/ARM64 = iPhone 5s, iPad Air, Retina iPad Mini
ARMv7s = iPhone 5, iPhone 5c, iPad 4
ARMv7 = iPhone 3GS, iPhone 4, iPhone 4S, iPod 3G/4G/5G, iPad, iPad 2, iPad 3, iPad Mini
ARMv6 = iPhone, iPhone 3G, iPod 1G/2G (一般不需要去支持)
要解决这个错误,应该关注以下几个属性设置:
1.Build Active Architecture Only属性
设置为yes时,只编译当前的设备(architecture)版本,提高debug是的编译速度;
设置为no时,会编译所有的版本(发布release时使用,以兼容各类型设备)。
注:编译出的版本是向下兼容的,比如你设置此值为yes,用iphone4编译出来的是armv7版本的,iphone5也可以运行,但是armv6的设备就不能运行。
2.Architectures与Valid Architectures区别及联系
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.
简单来说就是工程被编译成可支持哪些指令集类型,而支持的指令集越多,对应生成二进制包就越大,也就是ipa包会变大。
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.
有效编译指令集,也就是Xcode编译出来的二进制包类型最终从这些类型产生,而编译出哪种指令集的包,将由Architectures与Valid Architectures(因此这个不能为空)的交集来确定,例如:
比如,你的Valid Architectures设置的支持arm指令集版本有:armv7/armv7s/arm64,对应的Architectures设置的支持arm指令集版本有:armv7s,这时Xcode只会生成一个armv7s指令集的二进制包。
编译集选择
如果你对ipa安装包大小有要求,可以减少安装包的指令集的数量,这样就可以尽可能的减少包的大小。当然这样做会使部分设备出现性能损失,当然在普通应用中这点体现几乎感觉不到,至少不会威胁到用户体检(这就跟win7系统在32位和64位运行QQ一样,你看得出么?)。或者你也还在担心这个问题,你可以把百度地图等SDK下载下来,使用lipo、ar等命令查看一下它们的编译架构。
注:不过,新版的app审核规则中,似乎已经逐渐要求app必须支持64位的设备,因此在今后的工程维护中得多关注解决兼容性问题。
参考文章:Xcode设置项之Architectures和Valid Architectures
以上是关于xcode工程编译错误:No architectures to compile for的主要内容,如果未能解决你的问题,请参考以下文章
xcode工程编译错误:error: Couldn’t materialize
Xcode编译 No such file or directory
xcode工程编译错误:missing required architecture i386 解决方法
xcode工程编译错误之iOS解决CUICatalog: Invalid asset name supplied问题
Xcode工程编译错误:“Cannot assign to 'self' outside of a method in the init family”