在项目中经常会应用到第三方的静态库, 在引入这些静态库的时候,经常出现这些问题:undefined symbols,duplicate symbol,其实在以前项目中也碰到过这种问题,只是当时单纯的为了解决问题,只是来了个大概的了解之后加了个链接参数,草草的结束了问题,今天上传代码到appstore得时候也碰到了这个问题, 居然一时不知道该怎么解决, 所以还是觉得该总结一下。
之所以需要额外的链接参数是由于 objective-c特殊的语言特性,(category)类别,当一个静态库库使用了类别来扩展系统类或原有的类(项目中存在的类),链接器不知该如何把原有的方法和静态库中类别的方法整合起来,虽然编译会通过,但是会导致在运行时奔溃现象,因为找不到可执行代码模块。会出现unrecongnized selector这样的错误。在编译到静态库时,这些代码模块实际上是存在不同的obj文件里的。引入链接参数-ObjC就是将静态库中的对象和类别全部引用进来(也有说法是将objective-c代码全部引用进来)。
-all_load: 引入静态库中所有的方法,这样会让程序变大外,可能引入一些通项目重名的名称。
-force_load:引入指定的静态库
参考
Universal static library problem in iPhone SDK,
cocos2d for Mac,Building Objective-C static libraries with categories
Objective-C categories in static library,How can I avoid “duplicate symbol” errors in xcode with shared static libraries?