徹底解決"symbols not found for architecture xxx"

這是一個經(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)錯。

Linked Framworks and Libraries

解決辦法:

將相應(yīng)的.a文件添加到Linked Framworks and Libraries中,就能解決問題。

2、第三方庫(.a或者.framework)缺少系統(tǒng)依賴庫

有些第三方庫,本身是依賴一些系統(tǒng)庫的,以Bugly為例,在官網(wǎng)上的集成文檔中,就會提醒用戶添加依賴,需要添加的依賴有:

bugly集成文檔片段
  • 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)錯的問題都能夠迎刃而解。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容