從"Undefined symbols for architecture xxx" 中了解iOS指令集

開發(fā)中經(jīng)常會(huì)遇到 Undefined symbols for architecture xxx 的錯(cuò)誤,

Undefined symbols for architecture

有時(shí)候用模擬器運(yùn)行好好的,用設(shè)備運(yùn)行就報(bào)錯(cuò)屋匕,即便是設(shè)備運(yùn)行好好的,執(zhí)行打包 Archive 時(shí)又出現(xiàn)這樣的錯(cuò)誤蒜哀,還有就是引用第三方靜態(tài)庫(Framework, lib.a)彪置,簡直就是比禽獸還禽獸拄踪。
哼!

遇到這類問題先不要慌,分析問題所在悉稠,準(zhǔn)確定位出問題來源才是快速解決問題的關(guān)鍵宫蛆。

我們知道這些代表著 iOS 設(shè)備的指令集,不同 iOS 設(shè)備運(yùn)行需要的指令集是不同的:

指令集 設(shè)備 備注
armv7 iPhone 4, iPhone 4s, iPod 5G, iPad 3 真機(jī)32位
armv7s iPhone 5, iPhone 5c, 舊版 iPod touch, iPad 4 真機(jī)32位(可能已經(jīng)消失了)
arm64 iPhone 5s 及以上版本的猛,iPad Air, Retina iPad Mini, 新版 iPod touch 真機(jī)64位
x86_64 iphone 6 及以上的模擬器 模擬器 64位

這些是在 Xcode 9.0 以上版本常用的耀盗,當(dāng)然還有 armv6i386 等對(duì)應(yīng) iPhone 3G 以前版本卦尊,iPhone 5 之前的模擬器叛拷,都已過時(shí),現(xiàn)在App 完全可以忽略岂却。

  1. 在運(yùn)行 Xcode 時(shí)忿薇,需要對(duì)指令集設(shè)置的地方在 Targets -> Building Settings -> Architectures
    Architectures

當(dāng)前適用的指令集即為 Valid Architectures中設(shè)置的,如圖為 armv7 armv7s arm64, 為什么要這樣設(shè)置完全是為了適應(yīng)現(xiàn)在市面上所有的 iOS 設(shè)備躏哩,并使各個(gè)設(shè)備發(fā)揮最佳性能署浩,指令集都是向下兼容的,armv7, armv7s完全可以運(yùn)行在 arm64指令集的設(shè)備上扫尺,但是反過來拿 arm64 運(yùn)行在 armv7, armv7s就不行筋栋,就好比 32位程序可以在64位的機(jī)器上運(yùn)行(只是無法發(fā)揮出64位機(jī)器優(yōu)越性),但是64位程序卻無法在32位機(jī)器上運(yùn)行一樣正驻。

所以再遇到類似 Undefined symbols for archite xxx 的編譯問題的時(shí)候弊攘,先想想是否運(yùn)行的設(shè)備環(huán)境不對(duì)呢?

Build Active Architecture Only 代表是否僅編譯當(dāng)前適用的指令集姑曙,一般是 Debug -> YES 加快編譯速度襟交, Release -> NO, 讓程序盡可能的適應(yīng)各種設(shè)備。當(dāng)然伤靠,如果 Valid Architectures 只設(shè)置了一種捣域,比如說必須在 arm64 環(huán)境下運(yùn)行,那這里設(shè)置 YES/NO 就沒什么意義了宴合。

  1. 指令集另一個(gè)必須注意的地方就是在制作靜態(tài)庫的時(shí)候焕梅,編譯不同的靜態(tài)庫會(huì)生成支持不同指令集的靜態(tài)庫,而編譯限定指令集的靜態(tài)庫往往是 Undefined symbols for archite xxx 的元兇形纺。
不同靜態(tài)庫支持的指令集

不同指令集生產(chǎn)的靜態(tài)庫大小對(duì)比

其中 sim.a 代碼用模擬器編譯生成的靜態(tài)庫丘侠,generic 代表 Build Only Device徒欣, comb 代表所有指令集的集合逐样,,其它顧名思義。

由此可見:
1脂新、 模擬器生成的 sim.a 只支持 x86_64挪捕,包的大小也最小,8MB争便;
2级零、iPhone 5SiPhone 6SP 生產(chǎn)的 iphone5S.a支持 arm64,由于支持一樣的指令集滞乙,所以靜態(tài)包也大小一致奏纪,9.1MB;
3斩启、選擇 Generic iOS Device 生成的指令集包含 armv7 arm64 包的大小基本等同于 sim.aiphone5S.a之和序调,明顯大了許多;
這也是上面 Build Active Architecture Only 為什么對(duì) Debug
Release做出不同設(shè)置的原因兔簇;
4发绢、一般的開發(fā)人員不會(huì)同時(shí)擁有所有機(jī)型的設(shè)備,尤其一些新的機(jī)型垄琐,動(dòng)輒上萬边酒,實(shí)在傷不起,沒有設(shè)備狸窘,適配還是要做啊墩朦,這就必須要做 模擬器 x86_64 支持,所以就有了后來的 comb.a 朦前,當(dāng)然如果開發(fā)完成后發(fā)布應(yīng)用介杆,完全可以不用做模擬器支持,生成的靜態(tài)包大小需要再加上 sim.a 的韭寸,需要 25.4 MB春哨。

當(dāng)然如果靜態(tài)庫代碼量不大,所有加起來也就幾MB甚至更少恩伺,對(duì)整體App大小影響微乎其微赴背,發(fā)布包也支持 x86_64 也是可以的,如果影響很大晶渠,那還是在發(fā)布的版本中盡量去掉對(duì)模擬器的支持凰荚。

(所有生成的指令集中,沒有發(fā)現(xiàn) armv7s,感覺應(yīng)該蘋果默默的把這個(gè)指令集的支持集成到了 armv7 中)

為了驗(yàn)證這個(gè)問題,特意(厚著臉皮)去借來了個(gè) iPhone 5 馬上試了下

iphone5

明顯的 armv7, 也驗(yàn)證了自己的猜測褒脯,至于是否完全棄用便瑟,或者在舊版的 iPod 中有使用,由于沒有設(shè)備番川,實(shí)在無法驗(yàn)證到涂。

iphone5

由此也可以看出來脊框,指令集包的大小是累加的,總包大小與分包大小之和是等同的践啄。

文章開始的報(bào)錯(cuò)圖源自把 sim.aiphone6sp.a 合并后生成的 comlib.a 放入工程中浇雹,而后用這個(gè)打包且打包設(shè)備選擇的 Generic iOS Device,因?yàn)檫@兩個(gè)指令集中都不含有 armv7屿讽, 而 Generic iOS Device 必須含有 armv7指令集昭灵,所以報(bào)錯(cuò)就出現(xiàn)了,于是就有了這篇文章伐谈。

當(dāng)再遇到到 Undefined symbols for architecture xxx 錯(cuò)誤時(shí)烂完,就不必慌張了,基本就曉得是哪里的問題了诵棵,當(dāng)然有些第三方框架可能并沒有做模擬器的支持 x86_64窜护,如果無法更改源代碼,只能把調(diào)試的模擬器換成 iOS設(shè)備了非春。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末柱徙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子奇昙,更是在濱河造成了極大的恐慌护侮,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件储耐,死亡現(xiàn)場離奇詭異羊初,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)什湘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門长赞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闽撤,你說我怎么就攤上這事得哆。” “怎么了哟旗?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵贩据,是天一觀的道長。 經(jīng)常有香客問我闸餐,道長饱亮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任舍沙,我火速辦了婚禮近上,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拂铡。我一直安慰自己壹无,他們只是感情好歼跟,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著格遭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪留瞳。 梳的紋絲不亂的頭發(fā)上拒迅,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音她倘,去河邊找鬼璧微。 笑死,一個(gè)胖子當(dāng)著我的面吹牛硬梁,可吹牛的內(nèi)容都是我干的前硫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼荧止,長吁一口氣:“原來是場噩夢啊……” “哼屹电!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起跃巡,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤危号,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后素邪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體外莲,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年兔朦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了偷线。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沽甥,死狀恐怖声邦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情摆舟,我是刑警寧澤翔忽,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站盏檐,受9級(jí)特大地震影響歇式,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胡野,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一材失、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧硫豆,春花似錦龙巨、人聲如沸笼呆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诗赌。三九已至,卻和暖如春秸弛,著一層夾襖步出監(jiān)牢的瞬間铭若,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工递览, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叼屠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓绞铃,卻偏偏與公主長得像镜雨,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子儿捧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359