Other Linker Flags做了什么?
今天在 研究静态库的时候,发现Other Linker Flags需要加上-Objc。就查阅资料一波。
Other Linker Flags是干嘛的?
Other Linker Flags到底是什么?实际就是ld命令除了默认参数以外的其他参数。ld命令实现的是链接器的工作。
也许有的人不清楚链接器是什么?
一个程序从简单的代码到可执行的文件,大致需要经以下步骤:
源代码>预处理器>编译器>汇编器>机器码>链接器>可执行文件
源代码经过一系列的处理以后,会生成对应的.obj文件,然后一个项目会有很多.obj文件。那么这些文件必然会有或多或少的联系。例如函数调用、属性使用、等。连接器的作用就是把这些目标文件和所用的一些库链接在一起形成一个完整的可执行文件。
Objective-C的链接器不会为每个方法建立符号表,而是仅仅为类建立符号表。这样的话,如果静态库中定义了已存在的一个类的分类,链接器就会以为这个类已经存在,不会把分类和核心类的代码和起来。这样的话,在最终的可执行文件中,就缺少分类里面的代码。这样函数调用就失败了
Other Linker Flags设置参数有以下3个:
- -Objc
- -all_load
- -force_load
-Objc会让链接器把静态库中所有的Objective-C类和分类都加载到最后的可执行文件,但是有一点,如果静态库中只有分类而没有类的时候,Objc就会失效。
-all_load会让那个链接器把所有找到的目标文件都加载到最终的可执行文件中,但是这个最好别用。因为如果你是用了不止一个静态库文件,然后又用了这个参数,那么你可能会遇到 ld: duplicate symbol错误。因为不同的库文件里面会有相同的目标文件。
-force_load
-force_load 所做的事情跟 -all_load 其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,这样的话,知识完全加载了一个库文件。不会影响其他库文件的按需加载。