最近遇到个编译问题,于是去了解了 Xcode 里的 Other Linker Flags 到底干啥用的,怕忘记,于是把原文摘抄下来,以下内容为作者原文,♪(・ω・)ノ感谢原作者分享
作者:72行代码
链接:原文链接
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
在用第三方库时,我们常常在 Xcode 的 Build Settings
下 Other Linker Flags
里面加入 -ObjC
标志,它和 Objective-C
的一个重要特性:类别(category
)有关
根据官方的解释,
Unix
的标准静态库实现和Objective-C
的动态特性之间有一些冲突:Objective-C
没有为每个函数(或者方法)定义链接符号,它只为每个类创建链接符号。这样当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时,出现"selector not recognized"
,也就是找不到方法定义的错误。
为了解决这个问题,引入了 -ObjC
标志,它的作用就是将静态库中所有的 Objective-C
代码都加载进来。可以看出,使用 -ObjC
可能会链接很多静态库中未被使用的 Objective-C
代码,极大的增加 APP 的代码体积。 不要以为这样就可以解决所有问题了,在64位的 Mac 系统或者 iOS 系统下,链接器有一个 bug,会导致只包含有类别的静态库无法使用 -ObjC
标志来加载文件。 变通方法是使用 -all_load
或者 -force_load
标志,它们的作用都是强制链接器把目标文件都加载进来,即使没有 objc 代码,不过 -all_load
作用于所有的库,而 -force_load
后面必须要指定具体文件加载的位置
Flags | 位置 | 作用 |
---|---|---|
-ObjC |
Other Linker Flags |
链接静态库中所有的 Objective-C 代码到 APP |
-all_load |
Other Linker Flags |
全加载,链接静态库中所有的代码到 APP,无论是 c 、c++ 还是 oc
|
-force_load |
Other Linker Flags |
链接指定静态库中所有的代码到 APP,无论是 c 、c++ 还是 oc
|
补充说明:
- 对于制作的静态库包含分类的,制作的工程中,可以不用设置
-ObjC
,但是使用时,必须要添加-ObjC
- 对于制作动态库包含分类的,制作的工程添加
-ObjC
,使用的工程可以不添加-ObjC