这2天升级到xcode6。用ios8 SDK编译老项目,各类Undefined symbols for architecture xxx,精神差点崩溃了。只是最后仍是攻克了,本文简单总结一下ios
简单来讲。Undefined symbols基本上等于JAVA的ClassNotFoundException,最多见的缘由有这几种:xcode
比方说。有一段代码我用了OpenGL。引入了头文件架构
#import <OpenGLES/ES2/glext.h>
在Build Settings里,第一项Architectures,是配置项目的编译体系结构,主要有如下3个配置项:app
Architectures:将要建立的Bundle支持的ARCHui
Valid Architectures:有效的ARCH。这个配置项没什么用。通常配置成armv7,armv7s,arm64便可了spa
Build Active Architecture Only:是否仅仅打当前链接设备相应的archcode
在真机上,常见的ARCH有3个:armv7,armv7s。arm64blog
armv7:相应iPhone4和iPhone4Sip
armv7s:相应iPhone5和iPhone5C,还有早期的iPadv8
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体积会比較大
说了这么多,这个为何形成Undefined symbols呢?因为还有另一条规则,就是build link阶段,用arm64生成的.o文件,没法link用armv7s或者armv7生成的.o文件,因此就会link error
常见的状况是,项目引用了一个第三方库(比方从pod来的库)。而这个第三方库打包的时候仅仅支持armv7s和armv7,而项目有使用arm64打包。这个时候就会由于没法link,而报错Undefined symbols
解决的办法是,或者又一次打包第三方库,增长arm64;或者本身的项目去掉arm64
这样的状况我仅仅遇到过一次。咱们的app可以链接一个外厂商的蓝牙打印机,对方提供了一个lib。当咱们的项目引入了这个lib以后,就没法在模拟器上build经过了,但是在真机上是没问题的