這是一個經(jīng)典的編譯報(bào)錯問題。相信大部分做iOS開發(fā)的同學(xué)都遇到過。剛開始遇到這個問題時(shí),我會先嘗試去改改build settings里面的配置,或者寄希望于clean,實(shí)在搞不定的時(shí)候,就到網(wǎng)上去搜,搜到的解決方法確實(shí)很多,但是能夠解決問題的卻很少,那是因?yàn)閷?dǎo)致該問題的原因非常多,別人的方法不一定適用。后來認(rèn)識到這樣的解決問題思路是錯誤的。不應(yīng)該沒有目的地去嘗試,而應(yīng)該從關(guān)鍵的提示"symbols not found for architecture xxx"入手,分析出可能導(dǎo)致該問題的原因,然后再有目的地去解決問題,做到對癥下藥,這樣效率才會高。
"symbols not found for architecture xxx",意思是二進(jìn)制代碼中缺少xxx(如arm64,下文以arm64為例)架構(gòu)。編譯器的錯誤提示肯定不會錯,那么為什么二進(jìn)制代碼中會缺少xxx呢?在解決問題之前,不妨先分析一下。
項(xiàng)目中的二進(jìn)制代碼一般有兩個來源,一是項(xiàng)目build實(shí)時(shí)編譯出來的,二是引入的第三方庫(這里指已經(jīng)編譯成二進(jìn)制的第三方庫,如.a或.framework文件)。對于第一種情況,毫無疑問,肯定是編譯時(shí)遇到某種問題,導(dǎo)致編譯不成功,因而缺少arm64;對于第二種情況,因?yàn)槭且呀?jīng)編譯完成的,則有兩種可能。第一種可能是第三方庫本身就不包含arm64,第二種可能是,雖然第三方庫包含了arm64,但是編譯器卻沒有找到。總結(jié)一下,導(dǎo)致該問題的本質(zhì)原因大概有三種:
- 確實(shí)不存在arm64
- 存在arm64但是找不到
- 因?yàn)槟撤N原因編譯不成功
抓住這三種本質(zhì)原因,是解決問題的關(guān)鍵。下面逐一舉一些這幾種原因的例子和解決方案。
一、二進(jìn)制中確實(shí)不存在arm64
可以通過在終端中使用如下命令查看二進(jìn)制文件所包含的架構(gòu):
lipo -info xxx
如得到結(jié)果:
$ lipo -info Hyphenate.framework/Hyphenate
Architectures in the fat file: Hyphenate.framework/Hyphenate are: i386 x86_64
說明該二進(jìn)制中確實(shí)不包含arm64,如果引入了這樣的二進(jìn)制文件,在運(yùn)行到真機(jī)時(shí)就會報(bào)錯。
解決辦法:
找到包含arm64架構(gòu)的二進(jìn)制文件。
二、存在arm64但是找不到
1、第三方庫(.a或者.framework)沒有添加到Linked Framworks and Libraries
有時(shí)候引入第三方庫(主要是靜態(tài)庫,如.a文件),是包含arm64架構(gòu)的,但是導(dǎo)入工程時(shí)方式不對,使得.a文件沒有添加到Linked Framworks and Libraries列表中,這時(shí)候編譯器編譯時(shí)會找不到該.a文件,就會報(bào)錯。

解決辦法:
將相應(yīng)的.a文件添加到Linked Framworks and Libraries中,就能解決問題。
2、第三方庫(.a或者.framework)缺少系統(tǒng)依賴庫
有些第三方庫,本身是依賴一些系統(tǒng)庫的,以Bugly為例,在官網(wǎng)上的集成文檔中,就會提醒用戶添加依賴,需要添加的依賴有:

- SystemConfiguration.framework
- Security.framework
- libz.dylib 或 libz.tbd
- libc++.dylib 或 libc++.tbd
需要把這些依賴庫添加到Linked Framworks and Libraries。如果忘記添加這些,編譯器無法編譯庫文件,因此就會找不到,就會報(bào)錯。
解決辦法:
將第三方庫的依賴系統(tǒng)庫添加到Linked Framworks and Libraries中
三、因?yàn)槟撤N原因編譯不成功
1、building settings中architecture不包含arm64
這種情況應(yīng)該大部分人都知道,你告訴編譯器不編譯arm64的架構(gòu),但是又要運(yùn)行在arm64架構(gòu)的手機(jī)上,當(dāng)然會報(bào)錯啦。
解決辦法:
這種情況的解決辦法就是,在building settings中,architectures中添加arm64架構(gòu)。
2、.m文件沒有添加到build phase
有時(shí)候因?yàn)槟撤N原因,使得.m文件沒有添加到build phases, Compile Sources中,導(dǎo)致編譯失敗,也會報(bào)這種錯誤。
解決辦法:
在build phases, Compile Sources中重新添加.m文件。
3、.m文件重復(fù)
項(xiàng)目中如果存在,兩個相同的.m文件,同樣會導(dǎo)致編譯失敗,也會報(bào)這種錯誤。
解決辦法:
刪除重復(fù)的.m文件。
4、-ObjC配置
集成第三方庫時(shí),有時(shí)候需要做-ObjC配置,-ObjC的作用是將靜態(tài)庫中任何Objective-C代碼都鏈接到APP中,不配置的話,有時(shí)會使工程因文件找不到編譯失敗,會報(bào)這種錯誤。
解決辦法:
Build Settings -> Linking -> Other Linker Flags ,添加上 -ObjC
5、集成含C++的庫
有些第三方庫包含C++代碼,用C++編譯器編譯得到的。如果引入了這種第三方庫(最典型的例子是百度地圖SDK),工程也需要使用C++編譯器編譯,否則會因編譯失敗報(bào)錯。
解決辦法:
最簡單的解決辦法是將工程中任意一個.m文件改成.mm后綴。
6、bitcode問題
有時(shí)候如果引入的第三方庫沒有使用bitcode,但是主工程中building settings的Enable Bitcode開關(guān)打開了,會引起編譯失敗,也會報(bào)"symbols not found for architecture xxx"錯誤,當(dāng)然也會有bitcode關(guān)鍵字的錯誤提示,比較明顯,也比較好解決。
解決辦法:
將主工程中Enable Bitcode開關(guān)關(guān)閉。
目前只想到這些,但實(shí)際中肯定不止這些,后面遇到了再更新。只要把握造成該問題的本質(zhì)原因,相信任何這種報(bào)錯的問題都能夠迎刃而解。