iOS 編譯Undefined symbols報錯問題

最多見的緣由有這幾種:架構

1 build的時候沒有加framework

好比說,有一段代碼我用了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

2 工程依賴的庫,編譯時Architectures不匹配

在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體積會比較大

相關文章
相關標籤/搜索