首页 > 代码库 > xcode工程编译错误:No architectures to compile for

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