Undefined symbols基本上等于JAVA的ClassNotFoundException,最常見的原因有這幾種:
1.build的時候沒有加framework
build的時候,compile階段沒有問題,但是link就報錯Undefined symbols for architecture xxx(這里xxx可能是armv7s,armv7或者arm64,取決于配置,稍后會說)。
解決方法是在Build Phases的Link Binary With Libraries里加入xxxx.framework,再編譯就ok了.
2.工程依賴的庫,編譯時Architectures不匹配
在Build Settings里,第一項Architectures,是配置項目的編譯體系結(jié)構(gòu),主要有下面3個配置項:
Architectures:將要創(chuàng)建的Bundle支持的ARCH
Valid Architectures:有效的ARCH,這個配置項沒什么用,一般配置成armv7,armv7s,arm64就行了
Build Active Architecture Only:是否只打當(dāng)前連接設(shè)備對應(yīng)的arch
在真機上,常見的ARCH有3個:armv7,armv7s,arm64
armv7:對應(yīng)iPhone4和iPhone4S
armv7s:對應(yīng)iPhone5和iPhone5C,還有早期的iPad
arm64/armv8:對應(yīng)iPhone5S和iPhone6系列,以及比較新的iPad,如iPad mini2,iPad Air
而ARCH是向下兼容的,比如用armv7打出來的包,可以運行在arm64架構(gòu)的設(shè)備上;反之不行。所以如果應(yīng)用要支持iPhone4系列,Architectures就一定要包含armv7才行
而Build Active Architecture Only是指是否僅當(dāng)前連接的設(shè)備的架構(gòu)打包。比如Architectures配置了armv7和arm64,Build Active Architecture Only設(shè)置為YES,那么連接iPhone4的時候,就會以armv7打包;連接iPhone5S的時候,就會以arm64打包。如果Build Active Architecture Only設(shè)置為NO,那么就會2種架構(gòu)都打,在運行期根據(jù)實際的設(shè)備架構(gòu)來執(zhí)行。所以最后打出來的Bundle體積會比較大
說了這么多,這個為什么造成Undefined symbols呢?因為還有另外一條規(guī)則,就是build link階段,用arm64生成的.o文件,無法link用armv7s或者armv7生成的.o文件,所以就會link error
常見的情況是,項目引用了一個第三方庫(比如從pod來的庫),而這個第三方庫打包的時候只支持armv7s和armv7,而項目有使用arm64打包,這個時候就會由于無法link,而報錯Undefined symbols
解決的辦法是,或者重新打包第三方庫,加入arm64;或者自己的項目去掉arm64
有時候在模擬器上無法構(gòu)建,在真機上可以
這種情況我只遇到過一次。我們的app可以連接一個外廠商的藍牙打印機,對方提供了一個lib。當(dāng)我們的項目引入了這個lib之后,就無法在模擬器上build通過了,但是在真機上是沒問題的---------來自someone