码迷,mamicode.com
首页 > 其他好文 > 详细

关于Xcode上的Other linker flags

时间:2015-06-15 14:36:11      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:cbuuid   unrecognized   other linker flags   -all_load   -objc   

一、问题说明

之前下了一个第三方的静态库.a,然后在运行时一直提示

2015-06-14 15:38:33.135 BRTExample[5890:695264] -[CBUUID toString]: unrecognized selector sent to instance 0x1742281c0

2015-06-14 15:38:33.135 BRTExample[5890:695264] *** Terminating app due to uncaught exception ‘NSInvalidArgumentException‘, reason: ‘-[CBUUID toString]: unrecognized selector sent to instance 0x1742281c0‘

*** First throw call stack:

(0x1848942d8 0x1960680e4 0x18489b3a4 0x184898154 0x18479accc 0x100082d7c 0x18450319c 0x184500b3c 0x1844fc9d4 0x1000e8fd4 0x1000e8f94 0x1000f3db8 0x1000ec2c4 0x1000f65d4 0x1000f8248 0x19689922c 0x196898ef0)

libc++abi.dylib: terminating with uncaught exception of type NSException

二、问题解决

很有可能静态库中添加了CBUUID的category,所以

Targets选项-Build Settings-搜索Other linker flags,输入-all_load
三、拓展

摘自(http://blog.sina.com.cn/s/blog_4cd8dd130102v47r.html)

Targets选项下有Other linker flags的设置,用来填写XCode的链接器参数,如:-ObjC -all_load -force_load等。
还记得我们在学习C程序的时候,从C代码到可执行文件经历的步骤是:
源代码 > 预处理器 > 编译器 > 汇编器 > 机器码 > 链接器 > 可执行文件
在最后一步需要把.o文件和C语言运行库链接起来,这时候需要用到ld命令。源文件经过一系列处理以后,会生成对应的.obj文件,然后一个项目必然会有许多.obj文件,并且这些文件之间会有各种各样的联系,例如函数调用。链接器做的事就是把这些目标文件和所用的一些库链接在一起形成一个完整的可执行文件。
如果要详细研究链接器做了什么,请看:http://www.dutor.net/index.php/2012/02/what-linkers-do/

那么,Other linker flags设置的值实际上就是ld命令执行时后面所加的参数。

下面逐个介绍3个常用参数:
-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中
-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。
-force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载

在添加完该库后,需要在Xcode的Build Settings下Other Linker Flags里面加入-ObjC标志,这个标志以前没使用过,所以我就专门研究了一下它的作用。

 之所以使用该标志,和Objective-C的一个重要特性:类别(category)有关。根据这里的解释,Unix的标准静态库实现和Objective-C的动态特性之间有一些冲突:Objective-C没有为每个函数(或者方法)定义链接符号,它只为每个类创建链接符号。这样当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时,出现"selector not recognized",也就是找不到方法定义的错误。为了解决这个问题,引入了-ObjC标志,它的作用就是将静态库中所有的和对象相关的文件都加载进来。



关于Xcode上的Other linker flags

标签:cbuuid   unrecognized   other linker flags   -all_load   -objc   

原文地址:http://blog.csdn.net/zyq527758142/article/details/46503317

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!