今日upload package 到 itunes Connect 失敗了,原因是引入的一個(gè) .framework
包含了“有問題”的架構(gòu),orz...
何為“有問題”,以下是我一個(gè)初學(xué)者對(duì)其的學(xué)習(xí)和認(rèn)識(shí),總結(jié)如下:
Q1: 靜態(tài)庫和動(dòng)態(tài)庫是什么?
A1: 可復(fù)用代碼我們會(huì)封裝成函數(shù),多個(gè)這樣的函數(shù)我們會(huì)整合到一個(gè)或多個(gè)源文件作為工具“庫”,比如我們會(huì)把這些源文件放置到一個(gè) Utility 文件夾,然后在一個(gè)頭文件中,把允許外部調(diào)用的方法都聲明在此處;進(jìn)一步考慮,這些可復(fù)用函數(shù)依賴關(guān)系甚少,起碼和業(yè)務(wù)無關(guān),因此我們可以提前對(duì)這些源文件編譯成二進(jìn)制可執(zhí)行文件,當(dāng)工程需要用到的時(shí)候我們引入這個(gè)工具二進(jìn)制文件即可,而工程會(huì)根據(jù)前面說到的頭文件中聲明的函數(shù)進(jìn)行調(diào)用,最后整個(gè)工程在編譯的時(shí)候,由于我們工具庫已經(jīng)編譯成二進(jìn)制文件了,因此無須編譯,但是在link的時(shí)候需要將二進(jìn)制文件和目標(biāo)文件(比如.o
,.obj
)link到一起。
Q2: 二進(jìn)制文件是什么?
A2: 所謂編譯就是把源文件.c .m等高級(jí)語言寫的程序經(jīng)過編譯器一系列處理步驟(預(yù)處理->詞法分析->語法分析->語義分析->中間語言IR生成->目標(biāo)代碼生成與優(yōu)化(生成的目標(biāo)代碼是asm匯編)-> 轉(zhuǎn)成機(jī)器語言,也就是CPU指令)),這么說來目標(biāo)文件就是存儲(chǔ)了0,1的數(shù)據(jù)塊,關(guān)鍵看CPU如何解釋這些0,1,是指令呢還是數(shù)據(jù)。
Q3: 何為Link?
A3: 編譯好的二進(jìn)制文件最后會(huì)和其他目標(biāo)文件link鏈接整合成一個(gè)二進(jìn)制文件。簡單來說,將一個(gè)個(gè)二進(jìn)制文件按照一定順序整合放置到一起,每個(gè)二進(jìn)制文件都不知道自己會(huì)放置在那個(gè)地址,但是二進(jìn)制內(nèi)部的指標(biāo)是確定的,因此我們會(huì)設(shè)置一個(gè)默認(rèn)的地址0x0000000,而內(nèi)部都是相對(duì)地址,當(dāng)link的時(shí)候我們會(huì)把預(yù)留的默認(rèn)地址改成正確的地址。
Q4: 靜態(tài)庫和動(dòng)態(tài)庫的區(qū)別?
A4: 兩者都是預(yù)先編譯好的,在編譯整個(gè)工程的時(shí)候,只對(duì)導(dǎo)入的靜態(tài)庫和動(dòng)態(tài)庫進(jìn)行l(wèi)ink操作;兩者的不同時(shí),靜態(tài)庫在編譯的時(shí)候會(huì)copy一份到最后的目標(biāo)二進(jìn)制執(zhí)行文件,而動(dòng)態(tài)庫則不會(huì),而只存儲(chǔ)指向動(dòng)態(tài)庫的引用。
Q5: 靜態(tài)庫和動(dòng)態(tài)庫在各平臺(tái)上的類型是什么?
A5: window下靜態(tài)庫.lib
,動(dòng)態(tài)庫dll
;unix和類unix系統(tǒng)下靜態(tài)庫.a
,動(dòng)態(tài)庫.so
;mac系統(tǒng)下靜態(tài)庫.a
和.framework
,動(dòng)態(tài)庫.dylib/.tbd
Q6:iOS 的 framework 是什么呢?
A6: framework其實(shí)是iOS/mac平臺(tái)自有的一種格式,其對(duì)二進(jìn)制庫,頭文件和資源進(jìn)行了封裝,便于分發(fā)和管理。系統(tǒng)的framework都是動(dòng)態(tài)庫,而自己開發(fā)的framework無論是動(dòng)態(tài)還是靜態(tài),都是要復(fù)制到目標(biāo)程序的,如此看來,貌似自己開發(fā)的都是“靜態(tài)庫”???蘋果稱之為 embedded framework。
Q7: armv7,armv7s,i386,x86_64架構(gòu),為何常說靜態(tài)庫包含了多種架構(gòu)?
A7: 上述都是指CPU的結(jié)構(gòu),支持的指令集。iPhone 的硬件配置幾乎每年都有更新,其中armv7可簡單理解為支持iPhone5之前的設(shè)備;而armv7s支持iPhone5之后的設(shè)備,arm64是更新的設(shè)備;i386和 x86_64 都是指PC的架構(gòu),前者是舊的mac,32位的,后者是64位。
Q8: 如何查看一個(gè)靜態(tài)庫包含哪些架構(gòu):
A8: 使用lipo -info library
命令,其他操作還有從已有庫中移除/添加/瘦包/,更多使用可用man lipo
查看。