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

這是一個經(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文件肚邢,就會報錯。

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懊渡。如果忘記添加這些刽射,編譯器無法編譯庫文件,因此就會找不到剃执,就會報錯誓禁。

解決辦法:

將第三方庫的依賴系統(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ì)原因画舌,相信任何這種報錯的問題都能夠迎刃而解已慢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末曲聂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子佑惠,更是在濱河造成了極大的恐慌朋腋,老刑警劉巖齐疙,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莉兰,死亡現(xiàn)場離奇詭異,居然都是意外死亡咆霜,警方通過查閱死者的電腦和手機穷绵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仲墨,“玉大人,你說我怎么就攤上這事目养×┯桑” “怎么了癌蚁?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵幻梯,是天一觀的道長努释。 經(jīng)常有香客問我礼旅,道長洽洁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任饿自,我火速辦了婚禮,結(jié)果婚禮上龄坪,老公的妹妹穿的比我還像新娘。我一直安慰自己健田,他們只是感情好烛卧,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妓局,像睡著了一般。 火紅的嫁衣襯著肌膚如雪好爬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天存炮,我揣著相機與錄音炬搭,去河邊找鬼蜈漓。 笑死,一個胖子當(dāng)著我的面吹牛融虽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灼芭,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼姿鸿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起苛预,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎热某,沒想到半個月后腻菇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昔馋,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年秘遏,在試婚紗的時候發(fā)現(xiàn)自己被綠了丘薛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邦危。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖倦蚪,靈堂內(nèi)的尸體忽然破棺而出希坚,到底是詐尸還是另有隱情,我是刑警寧澤裁僧,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站慕购,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏沪悲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一可训、第九天 我趴在偏房一處隱蔽的房頂上張望昌妹。 院中可真熱鬧,春花似錦飞崖、人聲如沸烂叔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牢裳。三九已至逢防,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忘朝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工局嘁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晦墙。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓晌畅,卻偏偏與公主長得像但指,于是被迫代替她去往敵國和親抗楔。 傳聞我的和親對象是個殘疾皇子棋凳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355