這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經過了,但是在真機上是沒問題的