Undefined symbols for architecture armv7錯(cuò)誤解決方案. ? xxxxxxx.a文件不支持armv7
一俱病、iPhone處理器(32/64位處理器)
蘋果手機(jī)的處理器并不都是64位鸡捐。是從iPhone5S開始尚骄,也即是A7處理器之后是64位處理器金蜀。
iPhone 5s以上都是64位荤懂,含5s珠移。
即iPhone 5s弓乙,iPhone 6,iPhone 6plus钧惧,iPhone 6s暇韧,iPhone 6s plus以及即將推出的iPhone 7,iPhone 7 plus浓瞪,iPhone 7s等系列也都將會(huì)是64位的懈玻。
iPhone SE是32位還是64位呢?
iPhone SE和iPhone 6S在性能上一樣強(qiáng)悍乾颁,采用64位 A9處理器和M9協(xié)動(dòng)處理器涂乌,并且同樣配備了2G內(nèi)存 艺栈。
二、i386/x86_64區(qū)分
x86與x86_64的問(wèn)題:原文鏈接:https://zhidao.baidu.com/question/154980890.html
來(lái)源于8086指令集的一系列處理器湾盒,都稱為x86處理器湿右。
8086是最早的16位x86處理器,i386是最早的32位x86處理器罚勾。所以軟件上標(biāo)稱i386的時(shí)候毅人,是指這個(gè)軟件是32位的,基于x86處理器尖殃。所有32位和64位的x86處理器都能運(yùn)行(除軟件規(guī)定的最低處理器限制)丈莺。
x86-64是x86指令集的64位擴(kuò)展,實(shí)現(xiàn)了從32位到64位的平滑遷移送丰。軟件上標(biāo)注x64或者amd64场刑,則是說(shuō)這個(gè)軟件是64位的,基于x86處理器蚪战。需要64位的x86處理器才能運(yùn)行牵现。
三、Undefined symbols for architecture xxxx解決方案
原文鏈接:http://blog.csdn.net/zuoyou1314/article/details/46638073
在iOS開發(fā)中經(jīng)常遇到的一個(gè)錯(cuò)誤是Undefined symbols for architecture arm64邀桑,這個(gè)錯(cuò)誤表示工程某些地方不支持arm64指令集瞎疼。那我們應(yīng)該怎么解決這個(gè)問(wèn)題了?我們不僅要解決這個(gè)問(wèn)題,更要了解出現(xiàn)這個(gè)問(wèn)題的根源.這樣根本上杜絕這類問(wèn)題發(fā)生.
對(duì)于iOS設(shè)備來(lái)說(shuō)iOS的指令集有armv6、armv7壁畸、armv7s贼急、arm64這樣四種,不同型號(hào)的iOS設(shè)備使用不同的指令集捏萍,下面是各自的區(qū)別:
armv6
iPhone太抓、iPhone 3G
iPod 1G、iPod 2G
armv7
iPhone 3GS令杈、iPhone 4
iPod 3G走敌、iPod 4G、iPod 5G
iPad逗噩、iPad 2掉丽、iPad 3、iPad Mini
armv7s
iPhone 5异雁、iPhone 5C
iPad 4
arm64
iPhone 5S? iPhone 6? iPhone 6Plus
iPad Air, Retina iPad Mini
在Xcode的target->Build Settings中有一個(gè)Architectures的分組主要是用來(lái)設(shè)置Architectures方面的內(nèi)容捶障,下面重點(diǎn)介紹下面幾個(gè)設(shè)置項(xiàng)的內(nèi)容。
ios-architectures-config.png
Architectures
該編譯選項(xiàng)指定了工程將被編譯成支持哪些指令集纲刀,支持指令集是通過(guò)編譯生成對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)包實(shí)現(xiàn)的项炼,如果支持的指令集數(shù)目有多個(gè),就會(huì)編譯出包含多個(gè)指令集代碼的數(shù)據(jù)包,造成最終編譯的包很大锭部。
官方文檔說(shuō)明:
Space-separated list of identifiers. Specifies the architectures (ABIs, processor models) to which the binary is targeted. When this build setting specifies more than one architecture, the generated binary may contain object code for each of the specified architectures.
Build Active Architectures Only
該編譯項(xiàng)用于設(shè)置是否只編譯當(dāng)前使用的設(shè)備對(duì)應(yīng)的arm指令集暂论。
當(dāng)該選項(xiàng)設(shè)置成YES時(shí),你連上一個(gè)armv7指令集的設(shè)備空免,就算你的Valid Architectures和Architectures都設(shè)置成armv7/armv7s/arm64空另,還是依然只會(huì)生成一個(gè)armv7指令集的二進(jìn)制包。
當(dāng)然該選項(xiàng)起作用的前提是你的Xcode必須成功連接了調(diào)試設(shè)備蹋砚。如果你沒(méi)有任何活躍設(shè)備扼菠,即Xcode沒(méi)有成功連接調(diào)試設(shè)備,就算該設(shè)置項(xiàng)設(shè)置成YES依然還會(huì)編譯Valid Architectures和Architectures指定的二進(jìn)制包坝咐。
通常情況下循榆,該編譯選項(xiàng)在Debug模式都設(shè)成YES,Release模式都設(shè)成NO墨坚。
官方文檔說(shuō)明:
Boolean value. Specifies whether the product includes only object code for the native architecture.
Valid Architectures
該編譯項(xiàng)指定可能支持的指令集秧饮,該列表和Architectures列表的交集,將是Xcode最終生成二進(jìn)制包所支持的指令集泽篮。
比如將Valid Architectures設(shè)置支持的arm指令集版本有:armv7盗尸、armv7s、arm64帽撑,對(duì)應(yīng)的Architectures設(shè)置的支持arm指令集版本有:armv7s泼各,這時(shí)Xcode只會(huì)生成一個(gè)armv7s指令集的二進(jìn)制包。
官方文檔說(shuō)明:
Space-separated list of identifiers. Specifies the architectures for which the binary may be built. During the build, this list is intersected with the value of ARCHS build setting; the resulting list specifies the architectures the binary can run on. If the resulting architecture list is empty, the target generates no binary.
說(shuō)明
1亏拉、指令集是向下兼容的扣蜻。比如,armv7s指令集的設(shè)備及塘,可以兼容運(yùn)行使用armv7莽使、armv6編譯的程序。
示例
在做項(xiàng)目的時(shí)候,用到了第三方社交分享靜態(tài)庫(kù)是時(shí)候,會(huì)編譯失敗,先來(lái)看看下圖
看,它忽略了那個(gè)靜態(tài)庫(kù)文件導(dǎo)致鏈接失敗了,然后我查看了靜態(tài)庫(kù)所支持的架構(gòu),打開終端輸入查看命令lipo - info xxx.a ,結(jié)果如下:
發(fā)現(xiàn)了這個(gè)靜態(tài)庫(kù)只支持armv7 armv7s i386 . 而在我的工程中Valid Architectures和Architectures中均包含了arm64的指令集,這就是說(shuō)明我需要編譯的app最終要支持arm64的,而程序中用到的靜態(tài)庫(kù)并沒(méi)有arm64,所以才導(dǎo)致了出錯(cuò),因此,需要我們?nèi)ブ匦孪螺d一個(gè)支持arm64的靜態(tài)庫(kù)文件,那么就可以正常編譯通過(guò)了.
參考文檔
1笙僚、《Xcode設(shè)置項(xiàng)之Architectures和Valid Architectures》
2芳肌、《xcode5 arm64》
3、《64-Bit Transition Guide for Cocoa Touch》
4味咳、iOS開發(fā)之Architectures設(shè)置
5庇勃、Xcode設(shè)置項(xiàng)之Architectures和Valid Architectures
6、Xcode Build Settings中的Architecture概述