粗談Xcode build setting 和build phaese

相信很多人寫(xiě)iOS項(xiàng)目?jī)H僅是按照默認(rèn)醒目生成的配置去寫(xiě)代碼,沒(méi)有去深究過(guò)哪些編譯配置是什么。這里來(lái)介紹總結(jié)一下一些相關(guān)的配置選項(xiàng),還有我近來(lái)工作的碰到的一些問(wèn)題,以及最后的解決。

build setting :

顧名思義,這是項(xiàng)目編譯前的一些配置。說(shuō)道項(xiàng)目的編譯過(guò)程,大家都知道是將源文件(.c , .m等)通過(guò)編譯轉(zhuǎn)化為目標(biāo)文件(.o),再通過(guò)鏈接器將.o文件轉(zhuǎn)化為可執(zhí)行文件。鏈接的過(guò)程就是把醒目里的一些引用庫(kù) 連進(jìn)來(lái)。有點(diǎn)扯遠(yuǎn)了。。。 ?言歸正傳,這個(gè)欄目里的設(shè)置很多,就說(shuō)說(shuō)一些常見(jiàn)的吧。

Architecture:

Valid Architecture:意思是項(xiàng)目所支持的手機(jī)的CPU架構(gòu),目前常用的也就是arm64,armv7,armv7s。

armv7設(shè)備 : iPhone 4, iPhone 4S

armv7s設(shè)備:iPhone 5,iPhone 5s, iPhone 5c

arm64設(shè)備:iPhone 5s iPhone 6 iPhone 6s ,iPhone 6p iPhone 7,iPhone 7p

build options:

Enable Bitcode:bitcode是被編譯程序的一種中間形式的代碼。包含bitcode配置的程序?qū)?huì)在App store上被編譯和鏈接。bitcode允許蘋(píng)果在后期重新優(yōu)化程序的二進(jìn)制文件,而不需要重新提交一個(gè)新的版本到App store上。這一項(xiàng)是與ipa包有關(guān)系,具體不會(huì)影響到性能,但是有的第三方是不支持這一項(xiàng)的,例如 大家熟知的JSONKit 所以需要把這個(gè)默認(rèn)的yes改為no。

Enable Testbility:這是單元測(cè)試有關(guān)選項(xiàng),項(xiàng)目里如果沒(méi)有單元測(cè)試 就關(guān)了吧。之前先項(xiàng)目里轉(zhuǎn)到(iOS 10 xcode 8)有個(gè)問(wèn)題,不知道有沒(méi)有使用face++做活體和人臉識(shí)別的,這個(gè)選項(xiàng)如果是yes會(huì)報(bào)編譯錯(cuò)誤,但是(iOS 9,xcode 7)沒(méi)有問(wèn)題。原因我也不曉得了。。。如果有人知道的話,歡迎留言。

Linking :

Other Link Flags :這是XCode的鏈接器參數(shù),有-ObjC ,-all_load, -force_load等取值。

-ObjC:是將項(xiàng)目里的OC類和分類在最后鏈接到可執(zhí)行文件中

-all_load:是項(xiàng)目的將所有都鏈接到可執(zhí)行文件中,哪怕是一個(gè)txt文件。。。

-force_load:所做的事情跟-all_load其實(shí)是一樣的,但是-force_load需要指定要進(jìn)行全部加載的庫(kù)文件的路徑,這樣的話,你就只是完全加載了一個(gè)庫(kù)文件,不影響其余庫(kù)文件的按需加載。

默認(rèn)是只加載 OC 類文件,這個(gè)在寫(xiě)項(xiàng)目時(shí)沒(méi)什么影響,但當(dāng)你寫(xiě)的是.a或者framwork的時(shí)候。不加-ObjC或者-all_load,而.a中又有 分類的話 就會(huì)報(bào)錯(cuò),因?yàn)檫@個(gè)分類并不會(huì)被編譯到.a中。

Signing:

code sign identity:證書(shū)的描述文件,開(kāi)發(fā)用開(kāi)發(fā)的。打包的時(shí)候用企業(yè)的。

development Team:證書(shū)所屬的單位。

Prefix header: pch文件。這個(gè)不用多講了吧。。。

Search Path:

User header search paths 和header search path:Library / Header Search Paths是一定會(huì)去搜索的。而User Header Search Paths只有在Always Search User Paths為Yes時(shí)才會(huì)被搜索。編碼時(shí)候通過(guò) #include 引入頭文件的方式有兩種 <> 和 ""。<> 是只從 Header Search Paths 中搜索, 而 "" 則能從? Header Search Paths 和 User Header Search Paths 中搜索。換言之 ,假如你把 路徑加到? User Header Search Paths 中,那么 你用 #include的方式去引入對(duì)應(yīng)的頭文件,就會(huì)報(bào)錯(cuò)。 如果加到? Header Search Paths,? 就沒(méi)有問(wèn)題了。

$(SRCROOT) 這個(gè)是 當(dāng)前工程的意思,添加的項(xiàng)目前需要加$(SRCROOT)/... ? 當(dāng)然 項(xiàng)目默認(rèn)是從項(xiàng)目路徑下查找,但是項(xiàng)目里有多個(gè)target的時(shí)候,這個(gè)地方就是設(shè)置的關(guān)鍵了。

-------------------------------------------華麗的分割線-------------------------------------------

build phaese :

build phaese選項(xiàng)卡

Target Dependencies?:就是項(xiàng)目中有多個(gè) target ,而當(dāng)前的target 需要依賴其他的target,這些target 最后的product是 .a活著framwork。

Compile Sources :

1.是項(xiàng)目里要編譯的.m文件,這里有個(gè)細(xì)節(jié):當(dāng)編譯.a文件的時(shí)候可以從這里把你不想編譯到.a的文件去掉,但是在原來(lái)的.a項(xiàng)目里不會(huì)出現(xiàn)編譯錯(cuò)誤。當(dāng)把.a導(dǎo)入其他項(xiàng)目調(diào)用時(shí) ,會(huì)報(bào)錯(cuò)誤,說(shuō)那個(gè)你去掉的文件例如a.o文件不存在,這說(shuō)明沒(méi)有編譯進(jìn)去。如果你的項(xiàng)目里有a.m就不會(huì)報(bào)錯(cuò)啦。
這個(gè)用處就是:給別的項(xiàng)目打包.a的時(shí)候很容易出現(xiàn)文件沖突,因?yàn)楦鞣N泛濫的第三方。。。像afn,sdwebimage等,這時(shí)就可以通過(guò)去掉.a里對(duì)應(yīng)的文件,前提是 你們使用的版本不要有太大的區(qū)別。當(dāng)然啦,最好不要再.a文件中引用第三方啦,或者 自己去把類名修改成全世界都不會(huì)重復(fù)的一份,哈哈哈 至少是用的人不會(huì)重復(fù)。那我就順便把一個(gè)可以統(tǒng)一修改類名的方法的鏈接貼出來(lái) .

2. 有的是用MRC寫(xiě)的第三方庫(kù)例如 JSONKit,需要在后邊的 compile flags加上-fno-objc-arc表示不啟用ARC。

Link Binary With Libraries: ? 這里是項(xiàng)目用到的第三方類庫(kù)和系統(tǒng)類庫(kù)。沒(méi)啥可說(shuō)的了

Copy Bundle Resources:這是項(xiàng)目用的資源文件。



下期預(yù)告 把我設(shè)計(jì)sdk的過(guò)程和心得敘述一下,多閱讀好的源碼,才會(huì)有更快的進(jìn)步。







最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 僅以方便自己查閱記錄前言1.靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)有什么異同?靜態(tài)庫(kù):鏈接時(shí)完整地拷貝至可執(zhí)行文件中,被多次使用就有多份冗...
    190CM閱讀 4,520評(píng)論 0 4
  • 靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的區(qū)別 首先來(lái)看什么是庫(kù),庫(kù)(Library)說(shuō)白了就是一段編譯好的二進(jìn)制代碼,加上頭文件就可以供別...
    吃瓜群眾呀閱讀 12,330評(píng)論 3 42
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,537評(píng)論 19 139
  • 讀詩(shī) 讀詩(shī) 你看到的是一個(gè)個(gè)雋美方塊 我看到的是方塊間隙半躲半露饑餓的掙扎的靈魂 垂吊在藍(lán)色網(wǎng)線的另一頭 用比特的...
    舒己懷_Frank閱讀 876評(píng)論 30 39
  • 何謂傻子?在我看來(lái),傻子與弱智、腦殘不同,他們身上有著兩種極端的性格特征,一方面他們知識(shí)淺薄,閱歷不深,還未形成扎...
    顏牧之閱讀 3,640評(píng)論 15 23

友情鏈接更多精彩內(nèi)容