Undefined symbols基本上等于JAVA的ClassNotFoundException郊酒,最常見的原因有這幾種:
1.build的時(shí)候沒有加framework
build的時(shí)候钧惧,compile階段沒有問題丧裁,但是link就報(bào)錯(cuò)Undefined symbols for architecture xxx(這里xxx可能是armv7s,armv7或者arm64缸浦,取決于配置夕冲,稍后會(huì)說)。
解決方法是在Build Phases的Link Binary With Libraries里加入xxxx.framework裂逐,再編譯就ok了.
2.工程依賴的庫,編譯時(shí)Architectures不匹配
在Build Settings里泣栈,第一項(xiàng)Architectures卜高,是配置項(xiàng)目的編譯體系結(jié)構(gòu),主要有下面3個(gè)配置項(xiàng):
Architectures:將要?jiǎng)?chuàng)建的Bundle支持的ARCH
Valid Architectures:有效的ARCH南片,這個(gè)配置項(xiàng)沒什么用掺涛,一般配置成armv7,armv7s疼进,arm64就行了
Build Active Architecture Only:是否只打當(dāng)前連接設(shè)備對(duì)應(yīng)的arch
在真機(jī)上薪缆,常見的ARCH有3個(gè):armv7,armv7s伞广,arm64
armv7:對(duì)應(yīng)iPhone4和iPhone4S
armv7s:對(duì)應(yīng)iPhone5和iPhone5C拣帽,還有早期的iPad
arm64/armv8:對(duì)應(yīng)iPhone5S和iPhone6系列,以及比較新的iPad嚼锄,如iPad mini2减拭,iPad Air
而ARCH是向下兼容的,比如用armv7打出來的包区丑,可以運(yùn)行在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的時(shí)候癣朗,就會(huì)以armv7打包拾因;連接iPhone5S的時(shí)候,就會(huì)以arm64打包斯棒。如果Build Active Architecture Only設(shè)置為NO盾致,那么就會(huì)2種架構(gòu)都打,在運(yùn)行期根據(jù)實(shí)際的設(shè)備架構(gòu)來執(zhí)行荣暮。所以最后打出來的Bundle體積會(huì)比較大
說了這么多庭惜,這個(gè)為什么造成Undefined symbols呢?因?yàn)檫€有另外一條規(guī)則穗酥,就是build link階段护赊,用arm64生成的.o文件,無法link用armv7s或者armv7生成的.o文件砾跃,所以就會(huì)link error
常見的情況是骏啰,項(xiàng)目引用了一個(gè)第三方庫(比如從pod來的庫),而這個(gè)第三方庫打包的時(shí)候只支持armv7s和armv7抽高,而項(xiàng)目有使用arm64打包判耕,這個(gè)時(shí)候就會(huì)由于無法link,而報(bào)錯(cuò)Undefined symbols
解決的辦法是翘骂,或者重新打包第三方庫壁熄,加入arm64;或者自己的項(xiàng)目去掉arm64
有時(shí)候在模擬器上無法構(gòu)建碳竟,在真機(jī)上可以
這種情況我只遇到過一次草丧。我們的app可以連接一個(gè)外廠商的藍(lán)牙打印機(jī),對(duì)方提供了一個(gè)lib莹桅。當(dāng)我們的項(xiàng)目引入了這個(gè)lib之后昌执,就無法在模擬器上build通過了,但是在真機(jī)上是沒問題的---------來自someone