一直没有足够的动力写一篇博客,尤其是在如此的深夜,安静的夜给我安静的大脑…其实我要说的是这是我第一篇正式技术博客,时间:深夜. 最近项目要求使用到 cordova实现 JS 和 Native的通信,于是我要集成 cordova到一个纯 OC写的项目中,具体什么是 cordova,怎么集成,有兴趣的可以自行百度或谷歌,在这就不多啰嗦了,为什么?看标题.
集成静态库
一般集成静态库的步骤很简单
1.将要集成的库文件拖入项目
2. link Binary中添加关联
当然这是最理想的静态库,也是我们最想要的步骤 ,但是这种情况很少.多数情况下我们都需要在 Build Setting的 Other link flag 中添加 -ObjC (注意是大写的 C,如果用小写的时候又时候是不灵的),-all_load, -force_load 等等 flag,如图
走到这一步也算差不多了,运行一下试试,如图
我擦,这是什么鬼,其实我一开始遇到的错误比这个要壮观的多,当时我就傻了,提示有8个重复引用,(8 duplicate),10+个 not found,网上搜索一下,答案都很直接,重复引用的需要经过自行筛选留下一个(stackoverflow如是说),not found的文件要从 search path移除,就是这些鬼
于是我一个个找到移除了,确实 warning少多了,这个问题就算暂时解决了吧,但是更大的问题是重复引用的,因为那几个第三方静态库的文件都不可以删,项目中都要引用的,删除任何一个都是不合理的行为,经过各种搜索,终于想到了,如果我只 load这一个静态库的文件不就解决重复引用的问题了吗,为此我将 Other link flag 改为如下图
运行
这是我的最后成果,(-ObjC我直接加到 Cordova.project上了)-force_load是可以指定一个库文件建立这个 flag的,也就是说其他的库文件在编译的时候不会受到影响.
这东西并不难,但在遇到情况的时候,我们往往是不知道答案的,某些有经验的人来说,这都不算事,但还有一部分人对这些东西是不甚了然的,看了这篇文章,希望能帮助到他们少走一些弯路.
最后写出 这三个 flag的区别,供大家查看.理解
- -all_load _force_load 的区别:
-all_load
IMPORTANT: For 64-bit and iPhone OS applications, there is a linker bug that prevents -ObjC from loading objects files from static libraries that contain only categories and no classes. The workaround is to use the -all_load or -force_load flags. -all_load forces the linker to load all object files from every archive it sees, even those without Objective-C code. -force_load is available in Xcode 3.2 and later. It allows finer grain control of archive loading. Each -force_load option must be followed by a path to an archive, and every object file in that archive will be loaded. 这个flag是专门处理-ObjC的一个bug的。用了-ObjC以后,如果类库中只有category没有类的时候这些category还是加载不进来。变通方法就是加入-all_load或者-force-load。-all_laod会强制 链接器把目标文件都加载进来,即使没有objc代码。-force_load在xcode3.2后可用。但是-force_load后面必须跟一个只想静态库的路径。
-force_load
When someone uses “-all_load”, every imported library is forced into memory whether its needed or not. A much better technique is “-force_load”: -force_load $(BUILT_PRODUCTS_DIR)/libarc.a This insures that ONLY your library is loaded, not every library.
2 . ObjC:
Unix的标准静态库实现和Objective-C的动态特性之间有一些冲突:Objective-C没有为每个函数(或者方法)定义链接符号,它只为每个类创建链接符号。这样当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时,出现”selector not recognized”,也就是找不到方法定义的错误。为了解决这个问题,引入了-ObjC标志,它的作用就是将静态库中所有的和对象相关的文件都加载进来
本文介绍了在iOS项目中集成静态库时遇到的问题及解决方案,特别是-ObjC、-all_load和-force_load的使用场景和区别。在遇到静态库重复引用和类别加载问题时,通过合理设置Other Linker Flags可以避免这些问题。文章最后详细解释了-all_load和-force_load的用途,以及它们与-ObjC的区别。
2083





