相信很多人寫iOS項(xiàng)目僅僅是按照默認(rèn)醒目生成的配置去寫代碼,沒有去深究過哪些編譯配置是什么涮拗。這里來介紹總結(jié)一下一些相關(guān)的配置選項(xiàng),還有我近來工作的碰到的一些問題,以及最后的解決。
build setting :
顧名思義三热,這是項(xiàng)目編譯前的一些配置鼓择。說道項(xiàng)目的編譯過程,大家都知道是將源文件(.c , .m等)通過編譯轉(zhuǎn)化為目標(biāo)文件(.o)就漾,再通過鏈接器將.o文件轉(zhuǎn)化為可執(zhí)行文件呐能。鏈接的過程就是把醒目里的一些引用庫 連進(jìn)來。有點(diǎn)扯遠(yuǎn)了抑堡。摆出。。 ?言歸正傳首妖,這個(gè)欄目里的設(shè)置很多偎漫,就說說一些常見的吧。
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ū)贏pp store上被編譯和鏈接。bitcode允許蘋果在后期重新優(yōu)化程序的二進(jìn)制文件节芥,而不需要重新提交一個(gè)新的版本到App store上在刺。這一項(xiàng)是與ipa包有關(guān)系,具體不會影響到性能头镊,但是有的第三方是不支持這一項(xiàng)的蚣驼,例如 大家熟知的JSONKit 所以需要把這個(gè)默認(rèn)的yes改為no。
Enable Testbility:這是單元測試有關(guān)選項(xiàng)相艇,項(xiàng)目里如果沒有單元測試 就關(guān)了吧颖杏。之前先項(xiàng)目里轉(zhuǎn)到(iOS 10 xcode 8)有個(gè)問題,不知道有沒有使用face++做活體和人臉識別的坛芽,這個(gè)選項(xiàng)如果是yes會報(bào)編譯錯(cuò)誤留储,但是(iOS 9,xcode 7)沒有問題咙轩。原因我也不曉得了获讳。。活喊。如果有人知道的話丐膝,歡迎留言。
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)行全部加載的庫文件的路徑,這樣的話最冰,你就只是完全加載了一個(gè)庫文件瘦棋,不影響其余庫文件的按需加載。
默認(rèn)是只加載 OC 類文件暖哨,這個(gè)在寫項(xiàng)目時(shí)沒什么影響赌朋,但當(dāng)你寫的是.a或者framwork的時(shí)候。不加-ObjC或者-all_load篇裁,而.a中又有 分類的話 就會報(bào)錯(cuò),因?yàn)檫@個(gè)分類并不會被編譯到.a中沛慢。
Signing:
code sign identity:證書的描述文件,開發(fā)用開發(fā)的达布。打包的時(shí)候用企業(yè)的团甲。
development Team:證書所屬的單位。
Prefix header: pch文件黍聂。這個(gè)不用多講了吧躺苦。。产还。
Search Path:
User header search paths 和header search path:Library / Header Search Paths是一定會去搜索的匹厘。而User Header Search Paths只有在Always Search User Paths為Yes時(shí)才會被搜索。編碼時(shí)候通過 #include 引入頭文件的方式有兩種 <> 和 ""脐区。<> 是只從 Header Search Paths 中搜索愈诚, 而 "" 則能從? Header Search Paths 和 User Header Search Paths 中搜索。換言之 牛隅,假如你把 路徑加到? User Header Search Paths 中炕柔,那么 你用 #include的方式去引入對應(yīng)的頭文件,就會報(bào)錯(cuò)倔叼。 如果加到? Header Search Paths,? 就沒有問題了汗唱。
$(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的文件去掉,但是在原來的.a項(xiàng)目里不會出現(xiàn)編譯錯(cuò)誤框弛。當(dāng)把.a導(dǎo)入其他項(xiàng)目調(diào)用時(shí) 辛辨,會報(bào)錯(cuò)誤,說那個(gè)你去掉的文件例如a.o文件不存在瑟枫,這說明沒有編譯進(jìn)去斗搞。如果你的項(xiàng)目里有a.m就不會報(bào)錯(cuò)啦。
這個(gè)用處就是:給別的項(xiàng)目打包.a的時(shí)候很容易出現(xiàn)文件沖突慷妙,因?yàn)楦鞣N泛濫的第三方僻焚。。膝擂。像afn虑啤,sdwebimage等,這時(shí)就可以通過去掉.a里對應(yīng)的文件架馋,前提是 你們使用的版本不要有太大的區(qū)別狞山。當(dāng)然啦,最好不要再.a文件中引用第三方啦叉寂,或者 自己去把類名修改成全世界都不會重復(fù)的一份萍启,哈哈哈 至少是用的人不會重復(fù)。那我就順便把一個(gè)可以統(tǒng)一修改類名的方法的鏈接貼出來 .
2. 有的是用MRC寫的第三方庫例如 JSONKit办绝,需要在后邊的 compile flags加上-fno-objc-arc表示不啟用ARC伊约。
Link Binary With Libraries: ? 這里是項(xiàng)目用到的第三方類庫和系統(tǒng)類庫。沒啥可說的了
Copy Bundle Resources:這是項(xiàng)目用的資源文件孕蝉。