Other Linker Flags 中的 参数详解

原文链接:https://blog.csdn.net/yuanmengong886/article/details/52687748

在iOS开发中,我们用三方库时,由于other Lineker Falgs 的设置问题导致一些三方静态库或者分类没有 编译到最终到符号表中

在xcode 的工程中 TARGETS -> build Settings -> other Linker Flags linking 中 链接系统的标准库 ,链接其他三方库的参数, 引用链接器参数

image

一个iOS程序 的运行过程

预编译 -》 编译-》汇编-》 链接 -》 可执行的目标文件

预编译: 在该阶段,编译器将C,或者OC中源代码中包含的stdio.h和#import 的库编译进来

编译: 在这个阶段,编译器首先要检查代码的规范性,是否有语法错误等,用来确定代码实际要做的工作,在检查无误后,编译器把代码翻译成汇编语言

汇编: 汇编阶段把编译阶段生成的汇编代码转化成二进制目标文件

链接: 将不同部分的代码和数据收集和组合成一个单一文件的过程,也就是把不同目标文件合并成最终可执行文件的过程,将编译输出的二进制文件链接成最终可执行的目标文件

注意在链接阶段时:

链接阶段时,将编译阶段一些只有函数声明的头文件,而没有函数实现的库链接到可执行文件中来)库分为动态库和静态库

静态库:是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时就不需要额外的库文件啦,(.a)

动态库:在程序执行时,由运行时链接文件加载库,这样可以节省系统的开销(.so)

而other linker Flags 就是对链接阶段时库文件的链接的影响

-ObjC

这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来。这样编译之后的app会变大(因为加载了其他的objc代码进来)。但是如果静态库中有类和category的话只有加入这个flag才行。

-all_load

这个flag是专门处理-ObjC的一个bug的。用了-ObjC以后,如果类库中只有category没有类的时候这些category还是加载不进来。变通方法就是加入-all_load或者-force-load。-all_load会强制链接器把目标文件都加载进来,即使没有objc代码。

注意:假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件

-force_load

这个flag所做的事情跟-all_load其实是一样的,只是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载 ,-force_load在xcode3.2后可用。

你可能感兴趣的:(Other Linker Flags 中的 参数详解)