Xcode 中 Build Setting 的兩處設(shè)置
這兩天在弄項(xiàng)目分支的時(shí)候纸兔,發(fā)現(xiàn)自己對(duì)項(xiàng)目中 build Setting 的這兩個(gè)東東老是感覺迷糊惰瓜,有點(diǎn)不清楚,特此筆記下汉矿。
- Other Linker Flags
- Search Paths
1崎坊、Other Linker Flags
通常我們會(huì)在這個(gè)選項(xiàng)中加入 ,最常用的是 -ObjC , 他們有什么作用呢洲拇?
- -ObjC
- -all_load
- -force_load
一般在我們使用某些靜態(tài)庫的時(shí)候奈揍,里面可能有一些類的分類,正常情況下 鏈接器 會(huì)以為這個(gè)分類已經(jīng)存在赋续,而不去讀了男翰,導(dǎo)致了我們?nèi)笔Я苏5墓δ埽詾榱税堰@些分類和核心類的代碼合起來纽乱,必要的時(shí)候我們得加上 -ObjC, 形成我們需要的可執(zhí)行文件蛾绎。
- -ObjC : 鏈接器把靜態(tài)庫中所有的Objective-C類和分類都加載到最后的可執(zhí)行文件中,保證都可執(zhí)行。但是當(dāng) 靜態(tài)庫中只有分類而沒有類的時(shí)候租冠,-ObjC參數(shù)就會(huì)失效了
- -all_load: 鏈接器把所有找到的目標(biāo)文件都加載到可執(zhí)行文件中鹏倘。但是可能不同的靜態(tài)庫使用了相同的文件導(dǎo)致出錯(cuò)。
- -force_load: 它也是讓鏈接器把所有找到的目標(biāo)文件都加載到可執(zhí)行文件中顽爹,但是它需要指定進(jìn)行全部加載的庫文件的路徑第股,從而保證只是完全加載了一個(gè)庫文件。
總的來說话原,一般用 -ObjC,就算當(dāng)其失效后诲锹,用 -force_load 就可以繁仁,而不用-all_load。
具體詳解可閱讀: 關(guān)于Xcode的Other Linker Flags
2归园、Search Paths
常用路徑 path 黄虱,就是下面三種啦:
Framework Search Paths
附加到項(xiàng)目中的framework 的搜索路徑。Library Search Paths
附加到項(xiàng)目中的第三方Library的搜索路徑庸诱。Header Search Path
頭文件的搜索路徑捻浦。User Header Search Paths
只有在Always Search User Paths為Yes時(shí)才會(huì)被搜索。
此處我們可以先來了解下:
- $(inherited):添加目錄的時(shí)候?qū)懮?“$(inherited)” 就是表示路徑自己從frameworks里面讀取桥爽。 默認(rèn)的情況下路徑配置是不被 Targets 繼承的朱灿,只有當(dāng)Targets的設(shè)置加入了$(inherited)時(shí)才被繼承,繼承來自更高一級(jí)的配置钠四。
- ${PODS_ROOT} : 使用 CocoaPods 時(shí)候盗扒,Pods 下的路徑。有時(shí)在用cocoaPod install 完成所需要的第三方類庫之后缀去,在要用的地方導(dǎo)入(#import)發(fā)現(xiàn)不提示侣灶,需要自己手動(dòng)加入,但現(xiàn)在很少見這種情況啦缕碎。
- ${SDK_DIR}: 指編譯目標(biāo)所使用的 SDK 的目錄褥影。
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk
- $(SRCROOT) : 代表項(xiàng)目工程文件目錄,很好的避免其他同學(xué)使用時(shí)需要再換路徑的情況咏雌。
- $(PROJECT_DIR) : 表示當(dāng)前工程文件夾目錄凡怎,相對(duì)路徑(相對(duì)于當(dāng)前項(xiàng)目文件夾)。和$(SRCROOT) 區(qū)別是它代表** 整個(gè)項(xiàng)目 **赊抖。
如最常見的錯(cuò)誤:
- warning:ld: warning: directory not founder option
查找 Library Search Paths 和 Framework Search Paths栅贴,刪掉編譯報(bào)warning的路徑即OK。 - warning:ld: library not found for -lPods
在 Build Setting 中 other linker flag 里熏迹,加上$(inherited)即可檐薯。
備注參考
http://small.qiang.blog.163.com/blog/static/978493072013112571950/
http://blog.devzeng.com/blog/ios-xcode-search-paths.html
http://ship2013.blog.163.com/blog/static/22861106720131126103130568/