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的問題:原文鏈接:https://zhidao.baidu.com/question/154980890.html
來源于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,則是說這個(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è)問題了?我們不僅要解決這個(gè)問題,更要了解出現(xiàn)這個(gè)問題的根源.這樣根本上杜絕這類問題發(fā)生.
對(duì)于iOS設(shè)備來說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的分組主要是用來設(shè)置Architectures方面的內(nèi)容,下面重點(diǎn)介紹下面幾個(gè)設(shè)置項(xiàng)的內(nèi)容。
ios-architectures-config.png
Architectures
該編譯選項(xiàng)指定了工程將被編譯成支持哪些指令集,支持指令集是通過編譯生成對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)包實(shí)現(xiàn)的,如果支持的指令集數(shù)目有多個(gè),就會(huì)編譯出包含多個(gè)指令集代碼的數(shù)據(jù)包,造成最終編譯的包很大。
官方文檔說明:
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è)備。如果你沒有任何活躍設(shè)備,即Xcode沒有成功連接調(diào)試設(shè)備,就算該設(shè)置項(xiàng)設(shè)置成YES依然還會(huì)編譯Valid Architectures和Architectures指定的二進(jìn)制包。
通常情況下,該編譯選項(xiàng)在Debug模式都設(shè)成YES,Release模式都設(shè)成NO。
官方文檔說明:
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)制包。
官方文檔說明:
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.
說明
1、指令集是向下兼容的。比如,armv7s指令集的設(shè)備,可以兼容運(yùn)行使用armv7、armv6編譯的程序。
示例
在做項(xiàng)目的時(shí)候,用到了第三方社交分享靜態(tài)庫是時(shí)候,會(huì)編譯失敗,先來看看下圖
看,它忽略了那個(gè)靜態(tài)庫文件導(dǎo)致鏈接失敗了,然后我查看了靜態(tài)庫所支持的架構(gòu),打開終端輸入查看命令lipo - info xxx.a ,結(jié)果如下:
發(fā)現(xiàn)了這個(gè)靜態(tài)庫只支持armv7 armv7s i386 . 而在我的工程中Valid Architectures和Architectures中均包含了arm64的指令集,這就是說明我需要編譯的app最終要支持arm64的,而程序中用到的靜態(tài)庫并沒有arm64,所以才導(dǎo)致了出錯(cuò),因此,需要我們?nèi)ブ匦孪螺d一個(gè)支持arm64的靜態(tài)庫文件,那么就可以正常編譯通過了.
參考文檔
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概述