armv6、armv7、armv7s、arm64 与开发静态库(.a)
聲明:本帖為在轉載和摘抄的基礎上進行補充。若轉載請備注原文出處。
/*
*? 第一部分 ?初步認識
*/
ARM是微處理器行業的一家知名企業,arm處理器以體積小和高性能的優勢在嵌入式設備中廣泛使用,它的性能在同等功耗產品中也很出色,幾乎所有手機都是使用它的。
Armv6、armv7、armv7s、arm64都是arm處理器的指令集,所有指令集原則上都是向下兼容的,如iPhone4S的CPU默認指令集為armv7指令集,但它同時也兼容armv6指令集,只是使用armv6指令集時無法充分發揮其性能,即無法使用armv7指令集中的新特性,同理,iPhone5的處理器標配armv7s指令集,同時也支持armv7指令集,只是無法進行相關的性能優化,從而導致程序的執行效率沒那么高。
?
需要注意的是iOS模擬器沒有運行arm指令集,編譯運行的是x86指令集,所以,只有在iOS設備上,才會執行設備對應的arm指令集。(所以,當我們開發靜態庫的時候,會根據arm指令集以及不同的設備[模擬器、真機]生成不同的靜態庫,發布出去的時候我們需要將它們整合起來。這個部分會在后文第三部分中講到)
目前為止Apple移動設備默認指令集(2014.8.22)
-------------------------------------------------------------------------------------
armv6 設備: iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch
armv7 設備:?iPhone3GS,?iPhone4,?iPhone4S
????????????????????? iPad, iPad2, iPad3(The New iPad), iPad mini
????????????????????? iPod Touch 3G, iPod Touch4
armv7s設備:?iPhone5,?iPhone5C, iPad4(iPad with Retina Display)
arm64 設備:?iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display)
-------------------------------------------------------------------------------------
XCode中與指令集相關的選項(Build Settings 面板下 Architectures):
?
Architectures: ? ? ?
指明選定Target要求被編譯生成的二進制包所支持的指令集支持指令集是通過編譯生成對應的二進制數據包實現的,如果支持的指令集數目有多個,就會編譯出包含多個指令集代碼的數據包,從而會造成最終編譯生成的包很大。(所以在允許的范圍內越少越好)
?
Valid Architectures:
指明可能支持的指令集并非Architectures列表中指明的指令集都會被支持,Valid Architectures限制可能被支持的指令集的范圍,即Valid Architectures和Architectures列表的交集,才是XCode最終生成二進制包所支持的指令集。
?
比如,將Architectures支持arm指令集設置為:armv7,armv7s,對應的Valid?Architectures的支持的指令集設置為:armv7s,arm64,那么此時,XCode生成二進制包所支持的指令集只有armv7s 。?
?
Build Active Architecture Only:
指明是否只編譯當前連接設備所支持的指令集
該選項起作用的條件有兩個,必須同時滿足才會起作用:
1. 其值設置為YES
2. XCode成功連接調試設備
假定我們將Build Active Architecture Only值設置為YES,同時XCode連接上手機iPhone5S(匹配指令集arm64)
?
1. 第一種情況
Architectures:? armv7, armv7s, arm64
ValidArchitectures: ?armv6, armv7s, arm64
生成二進制包支持的指令集: arm64?
?
2. 第二種情況
Architectures: armv6, armv7, armv7s
Valid?Architectures: ?armv6, armv7s, arm64
生成二進制包支持的指令集: armv7s?
?
3. 第三種情況
Architectures:? armv6, armv7
Valid?Architectures: armv6, armv7s, arm64
生成二進制包支持的指令集: armv7
?
4. 第四種情況
Architectures: armv6
Valid?Architectures: armv6, armv7s, arm64
生成二進制包支持的指令集: 雖然編譯成功了,但是并沒有任何目標生成,?因為從XCode4.5開始,就不再支持armv6指令集,所以列表中寫了也是白寫。
?
5. 第五種情況
Architectures: armv7, armv7s, arm64
Valid?Architectures: armv7,armv7s
生成二進制包支持的指令集: 編譯出錯信息
可以看出:當Build Active Architecture Only起作用時:
連接的手機指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的。
?
如連接手機為iPhone5S,其默認指令集為arm64,若Architectures列表為armv7, armv7s,則會選取armv7s指令集為目標指令集,如果此時Valid?Architectures列表中包含該指令集,則成功生成的二進制包只支持armv7s指令集,若alid?Architectures列表不包含此指令集,則編譯將會出錯:
?
同樣的,若Architectures列表為armv7,則會選取armv7作為目標指令集,若Valid?Architectures列表中包含了armv7指令集,則能夠成功生成二進制包,其支持的指令集只有armv7,若Valid?Architectures列表中不包含armv7,則編譯失敗。
建議:通常Debug模式設置值為Yes,Release模式設置為No
/*
*? 第二部分 ?發展:Xcode6更新默認不支持armv7s架構
*/
目前Xcode 6配置里定義${ARCHS_STANDARD}為armv7, arm64。當前iPhone5的A6和iPad4的A6X兩款CPU都是armv7s架構,而之后在iPhone 5S、iPad Air以及iPad Mini Retina采用的A7處理器則是屬于64位的arm64架構。這倒不是什么大問題,雖然或多或少存在一些瑕疵,A6一樣可以運行基于armv7架構的代碼。會讓人感到不爽的可能就是某天你的Xcode突然無法構建代碼然后告訴你一個關于丟失某架構鏈接庫的錯誤,其實不過就是因為你升級了你的Xcode而已。
總結一下:蘋果又在此迫使我們做出新選擇:armv7s這一架構已經隨著兩代64位產品的出現而遭報銷(即armv7s已經不建議使用)。不過作為一個組件開發人員我認為仍然應該包括armv7s然后讓開發者去決定支不支持。
/*
*?第三部分 ?開發靜態庫組件
*/
一、建立相應的靜態庫項目:比如你取名為demo,將會獲得對應的Demo.h和Demo.m文件。
二、將.h和.m文件寫入可執行代碼。
三、編譯靜態庫前的設置:
1.編譯靜態庫分為兩種模式:Edit Scheme->Run->Build Configuration->Debug/Release。
Debug、Release調用兩個不同的底層庫。Debug是調試版本,當選擇Debug版的程序才能設置斷點、單步執行和NSLog等輸出語句。Release版本不包含任何調試信息,所以體積更小、運行速度快。
2.然后就是選擇編譯對象[真機or模擬器],然后直接Build and Run啦!
3.找到生成的.a文件:Window->Organizer->Demo->Derived Data,可以看到相應的路徑,不過右側還有個小小的向右的箭頭,點擊一下就能把我們快速打開相應路徑文件夾
4.生成的.a文件就在以下三個文件夾下,其實還有個debug模式的模擬器類型的,根據自己需要來生成吧。每一個文件夾下都有三個文件/文件夾:分別是libDemo.a、include(文件夾下含有Demo.h)、DemoTest.xctest 。我們將相應的.h和.a文件導入需要的工程就能使用了。
5.切記如果調試的時候使用了不對等版本的靜態庫,是會報錯的哦!
所以這里我們寫一點關于將多個靜態庫合并為一個靜態庫(就是第一部分里面說的待會再說的問題哈):
方法很簡單,打開終端,執行合并真機和模擬器的庫的命令是 lipo -create xxxx_iphoneos.a xxxx_simulator.a -output xxxx.a
靜態庫大小:通用版本 >= 模擬版本+真機版
另外查看支持構架的命令是lipo -info 路徑/Demo.a
模擬器.a 輸出是 i386 x86_64?
真機.a 輸出是armv7 arm64
通用版.a輸出是armv7 i386 x86_64?arm64
生成的通用版.a的路徑就在執行命令對應的文件夾的位置
當然啦,你想查看支持架構的時候可能報錯,比如:
xcrun: error: active developer path ("/Applications/Xcode.app/Contents/Developer") does not exist, use xcode-select to change
對應的解決方法,終端執行:sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer 即可解決
相關原帖鏈接:
http://blog.csdn.net/hxl188/article/details/39291159 第一部分
http://www.cocoachina.com/ios/20141013/9897.html 第二部分
http://blog.csdn.net/king_jensen/article/details/20376179 第三部分
總結
以上是生活随笔為你收集整理的armv6、armv7、armv7s、arm64 与开发静态库(.a)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机面试 OA 试题及答案,办公自动化
- 下一篇: 计算机地址输入法教案,计算机教案(输入法