相信很多人寫(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 :

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)目用的資源文件。