Xcode链接选项-ObjC -all_load -force_load详解
2016-03-16 19:45
357 查看
-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中
-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld:
duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。
-force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载。
在Xcode工程的Other linker flags中添加-ObjC 标志可以解决使用静态库中的category时出现unrecognized selector的问题。
UNIX的静态库(xxx.a)其实就是一个目标文件(xxx.o)的集合。在C语言中,编译一个源文件时如果遇到在其他文件中定义的函数,则会留下一个
undefined symbol。在链接时会通过找到其他文件中的定义来确定这个symbol。
在Objective-C中,由于方法调用都是在运行期确定的,因此没有针对方法的symbol,只有针对类的。
这样在静态库中如果使用了category扩展已有的类,编译器不知道如何将category和已有的类整合在一起,就会导致unrecognized selector问题。添加-ObjC标志后,编译器会把一个类相关的所有目标文件都加载,这样就解决了这个问题。但是由于这样做会使可执行文件体积变大,所以没有设为默认选项。
-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld:
duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。
-force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载。
在Xcode工程的Other linker flags中添加-ObjC 标志可以解决使用静态库中的category时出现unrecognized selector的问题。
UNIX的静态库(xxx.a)其实就是一个目标文件(xxx.o)的集合。在C语言中,编译一个源文件时如果遇到在其他文件中定义的函数,则会留下一个
undefined symbol。在链接时会通过找到其他文件中的定义来确定这个symbol。
在Objective-C中,由于方法调用都是在运行期确定的,因此没有针对方法的symbol,只有针对类的。
这样在静态库中如果使用了category扩展已有的类,编译器不知道如何将category和已有的类整合在一起,就会导致unrecognized selector问题。添加-ObjC标志后,编译器会把一个类相关的所有目标文件都加载,这样就解决了这个问题。但是由于这样做会使可执行文件体积变大,所以没有设为默认选项。
相关文章推荐
- 初始化与清理
- 梧桐树
- Jenkins-Docker-Tomcat-Java Rest 使用shell脚本构建项目示例
- POJ3620 Avoid The Lakes
- U3D打包DLL插件 DLL Builder
- 深入理解Lua的闭包一:概念和应用
- c#中的数据类型简介(委托)
- PHP configure 参数
- Poj 2886 Who Gets the Most Candies?
- Android中的门面模式
- 视频编解码学习之二:数字视频
- Leetcode 147. Insertion Sort List(链表实现快排)
- ZeroC Ice Ice Registry实现负载均衡
- Java中Map按值排序
- Linux---nginx+ffmpeg搭建流媒体服务器
- Ice Registry实现负载均衡
- ubuntu14.04安装telnet
- JavaScript学习笔记(9)——JavaScript语法之流程控制
- Leetcode 19 Remove Nth Node From End of List 链表
- Android---61---TabHost简单使用