最多见的缘由有这几种:架构
好比说,有一段代码我用了OpenGL,引入了头文件ui
#import <OpenGLES/ES2/glext.h>
build的时候,compile阶段没有问题,可是link就报错Undefined symbols for architecture xxx(这里xxx多是armv7s,armv7或者arm64,取决于配置,稍后会说)。解决方法是在Build Phases的Link Binary With Libraries里加入OpenGLES.framework,再编译就ok了v8
在Build Settings里,第一项Architectures,是配置项目的编译体系结构,主要有下面3个配置项:it
Architectures:将要建立的Bundle支持的ARCH编译
Valid Architectures:有效的ARCH,这个配置项没什么用,通常配置成armv7,armv7s,arm64就好了import
Build Active Architecture Only:是否只打当前链接设备对应的arch打包
在真机上,常见的ARCH有3个:armv7,armv7s,arm64配置
armv7:对应iPhone4和iPhone4S方法
armv7s:对应iPhone5和iPhone5C,还有早期的iPadim
arm64/armv8:对应iPhone5S和iPhone6系列,以及比较新的iPad,如iPad mini2,iPad Air
而ARCH是向下兼容的,好比用armv7打出来的包,能够运行在arm64架构的设备上;反之不行。因此若是应用要支持iPhone4系列,Architectures就必定要包含armv7才行
而Build Active Architecture Only是指是否仅当前链接的设备的架构打包。好比Architectures配置了armv7和arm64,Build Active Architecture Only设置为YES,那么链接iPhone4的时候,就会以armv7打包;链接iPhone5S的时候,就会以arm64打包。若是Build Active Architecture Only设置为NO,那么就会2种架构都打,在运行期根据实际的设备架构来执行。因此最后打出来的Bundle体积会比较大