加载中…
个人资料
花开花落情常在
花开花落情常在
  • 博客等级:
  • 博客积分:0
  • 博客访问:190
  • 关注人气:1
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Xcode中导入.a静态库后报错添加-force_load或-all_load

(2016-06-21 15:26:57)
    
       以前在做项目的时候在Xcode中倒入一个三方SDK的时候,会有一些.a的静态库,这时候如果直接编译运行就会报错。当时只知道往build settings的linker flags 里面添加-force_load和.a文件的路径。最近又多次用到,这里总结一下。

例如在Xcode中倒入一个SIPSKDK,如下,这里面包含了一个.a的静态库。

如果直接运行的没用到里面方法的时候运行时没问题的,但是一旦导入头文件,并创建SIPClient对象的时候就会报错,如下所示:http://s15/mw690/005Mx93Bty72ECbN2h08e&690

这里报错的原因主要是Xcode找不到里面.a文件中的类,所以需要在build settings的linker flags 中添加-ObjC来告诉链接器,把库中的类和category都加载进来,这样编译后app会变大,因为加载了其它的OC代码进来。

而且如果.a静态库中只有分类没有类的话这样也不行。这时候就要在添加了-ObjC的基础上再添加一行-all_load.
-all_load是专门处理-ObjC的一个bug的,用了-ObjC后,如果类库中只有category,没有类的话,这样category还是加载不进来。这时候再加入-all_load就是告诉链接器强制把所有的目标文件都加载进来。但是这样在导入多个.a文件的时候如果都这样做,可能会导致你的目标程序大小增大,而且往往容易引起一些冲突,而这些冲突往往你无法解决(常常出现在你链接的各种库中)。
这时候可以使用-force_load只加载你方法所需要的库,但是使用它需要再添加.a文件的路径。不需再添加-ObjC

所以比较好的解决办法就是在build settings的linker flags中添加两个:

1.  -force_load
2.  .a文件的路径(例如在上面SDK: $(SRCROOT)/lib/libbaidumapapi.a)

http://s7/mw690/005Mx93Bty72EDtFhY276&690

这样运行就OK了。


                                     iOS杨少
                                      2016.06.21

                        


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有