這是一個經(jīng)典的編譯報錯問題。相信大部分做iOS開發(fā)的同學(xué)都遇到過。剛開始遇到這個問題時暴凑,我會先嘗試去改改build settings里面的配置,或者寄希望于clean赘来,實在搞不定的時候现喳,就到網(wǎng)上去搜,搜到的解決方法確實很多撕捍,但是能夠解決問題的卻很少拿穴,那是因為導(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呢?在解決問題之前间护,不妨先分析一下亦渗。
項目中的二進(jìn)制代碼一般有兩個來源,一是項目build實時編譯出來的汁尺,二是引入的第三方庫(這里指已經(jīng)編譯成二進(jìn)制的第三方庫法精,如.a或.framework文件)。對于第一種情況痴突,毫無疑問搂蜓,肯定是編譯時遇到某種問題,導(dǎo)致編譯不成功辽装,因而缺少arm64帮碰;對于第二種情況,因為是已經(jīng)編譯完成的如迟,則有兩種可能收毫。第一種可能是第三方庫本身就不包含arm64,第二種可能是殷勘,雖然第三方庫包含了arm64此再,但是編譯器卻沒有找到×嵯總結(jié)一下输拇,導(dǎo)致該問題的本質(zhì)原因大概有三種:
- 確實不存在arm64
- 存在arm64但是找不到
- 因為某種原因編譯不成功
抓住這三種本質(zhì)原因,是解決問題的關(guān)鍵贤斜。下面逐一舉一些這幾種原因的例子和解決方案策吠。
一、二進(jìn)制中確實不存在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)制中確實不包含arm64瘩绒,如果引入了這樣的二進(jìn)制文件猴抹,在運行到真機時就會報錯。
解決辦法:
找到包含arm64架構(gòu)的二進(jìn)制文件锁荔。
二蟀给、存在arm64但是找不到
1、第三方庫(.a或者.framework)沒有添加到Linked Framworks and Libraries
有時候引入第三方庫(主要是靜態(tài)庫,如.a文件)跋理,是包含arm64架構(gòu)的择克,但是導(dǎo)入工程時方式不對,使得.a文件沒有添加到Linked Framworks and Libraries列表中前普,這時候編譯器編譯時會找不到該.a文件肚邢,就會報錯。
解決辦法:
將相應(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懊渡。如果忘記添加這些刽射,編譯器無法編譯庫文件,因此就會找不到剃执,就會報錯誓禁。
解決辦法:
將第三方庫的依賴系統(tǒng)庫添加到Linked Framworks and Libraries中
三、因為某種原因編譯不成功
1肾档、building settings中architecture不包含arm64
這種情況應(yīng)該大部分人都知道摹恰,你告訴編譯器不編譯arm64的架構(gòu),但是又要運行在arm64架構(gòu)的手機上怒见,當(dāng)然會報錯啦俗慈。
解決辦法:
這種情況的解決辦法就是,在building settings中遣耍,architectures中添加arm64架構(gòu)闺阱。
2、.m文件沒有添加到build phase
有時候因為某種原因舵变,使得.m文件沒有添加到build phases, Compile Sources中酣溃,導(dǎo)致編譯失敗,也會報這種錯誤纪隙。
解決辦法:
在build phases, Compile Sources中重新添加.m文件赊豌。
3、.m文件重復(fù)
項目中如果存在绵咱,兩個相同的.m文件碘饼,同樣會導(dǎo)致編譯失敗,也會報這種錯誤。
解決辦法:
刪除重復(fù)的.m文件派昧。
4黔姜、-ObjC配置
集成第三方庫時,有時候需要做-ObjC配置蒂萎,-ObjC的作用是將靜態(tài)庫中任何Objective-C代碼都鏈接到APP中秆吵,不配置的話,有時會使工程因文件找不到編譯失敗五慈,會報這種錯誤纳寂。
解決辦法:
Build Settings -> Linking -> Other Linker Flags ,添加上 -ObjC
5泻拦、集成含C++的庫
有些第三方庫包含C++代碼毙芜,用C++編譯器編譯得到的。如果引入了這種第三方庫(最典型的例子是百度地圖SDK)争拐,工程也需要使用C++編譯器編譯腋粥,否則會因編譯失敗報錯。
解決辦法:
最簡單的解決辦法是將工程中任意一個.m文件改成.mm后綴架曹。
6、bitcode問題
有時候如果引入的第三方庫沒有使用bitcode绑雄,但是主工程中building settings的Enable Bitcode開關(guān)打開了展辞,會引起編譯失敗万牺,也會報"symbols not found for architecture xxx"錯誤罗珍,當(dāng)然也會有bitcode關(guān)鍵字的錯誤提示脚粟,比較明顯覆旱,也比較好解決。
解決辦法:
將主工程中Enable Bitcode開關(guān)關(guān)閉核无。
目前只想到這些通殃,但實際中肯定不止這些,后面遇到了再更新厕宗。只要把握造成該問題的本質(zhì)原因画舌,相信任何這種報錯的問題都能夠迎刃而解已慢。