这两天在弄项目分支的时候,发现自己对项目中 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/