Other Linker Flags 中的 参数详解

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

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

一个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后可用。

参考资料 : http://small.qiang.blog.163.com/blog/static/978493072013112571950/




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值