這兩天在弄項目分支的時候,發現自己對項目中 build Setting 的這兩個東東老是感覺迷糊,有點不清楚,特此筆記下。
- Other Linker Flags
- Search Paths
1、Other Linker Flags
通常我們會在這個選項中加入 ,最常用的是 -ObjC , 他們有什么作用呢?
- -ObjC
- -all_load
- -force_load
一般在我們使用某些靜態庫的時候,里面可能有一些類的分類,正常情況下 鏈接器 會以為這個分類已經存在,而不去讀了,導致了我們缺失了正常的功能,所以為了把這些分類和核心類的代碼合起來,必要的時候我們得加上 -ObjC, 形成我們需要的可執行文件。
- -ObjC : 鏈接器把靜態庫中所有的Objective-C類和分類都加載到最后的可執行文件中,保證都可執行。但是當 靜態庫中只有分類而沒有類的時候,-ObjC參數就會失效了
- -all_load: 鏈接器把所有找到的目標文件都加載到可執行文件中。但是可能不同的靜態庫使用了相同的文件導致出錯。
- -force_load: 它也是讓鏈接器把所有找到的目標文件都加載到可執行文件中,但是它需要指定進行全部加載的庫文件的路徑,從而保證只是完全加載了一個庫文件。
總的來說,一般用 -ObjC,就算當其失效后,用 -force_load 就可以,而不用-all_load。
具體詳解可閱讀: 關于Xcode的Other Linker Flags
2、Search Paths
常用路徑 path ,就是下面三種啦:
Framework Search Paths
附加到項目中的framework 的搜索路徑。Library Search Paths
附加到項目中的第三方Library的搜索路徑。Header Search Path
頭文件的搜索路徑。User Header Search Paths
只有在Always Search User Paths為Yes時才會被搜索。
此處我們可以先來了解下:
- $(inherited):添加目錄的時候寫上 “$(inherited)” 就是表示路徑自己從frameworks里面讀取。 默認的情況下路徑配置是不被 Targets 繼承的,只有當Targets的設置加入了$(inherited)時才被繼承,繼承來自更高一級的配置。
- ${PODS_ROOT} : 使用 CocoaPods 時候,Pods 下的路徑。有時在用cocoaPod install 完成所需要的第三方類庫之后,在要用的地方導入(#import)發現不提示,需要自己手動加入,但現在很少見這種情況啦。
- ${SDK_DIR}: 指編譯目標所使用的 SDK 的目錄。
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk
- $(SRCROOT) : 代表項目工程文件目錄,很好的避免其他同學使用時需要再換路徑的情況。
- $(PROJECT_DIR) : 表示當前工程文件夾目錄,相對路徑(相對于當前項目文件夾)。和$(SRCROOT) 區別是它代表** 整個項目 **。
如最常見的錯誤:
- warning:ld: warning: directory not founder option
查找 Library Search Paths 和 Framework Search Paths,刪掉編譯報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/