首页 > 代码库 > Xcode中导入.a静态库后报错添加-force_load或-all_load

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

第一种方法:
       以前在做项目的时候在Xcode中倒入一个三方SDK的时候,会有一些.a的静态库,这时候如果直接编译运行就会报错。当时只知道往build settings的linker flags 里面添加-force_load和.a文件的路径。最近又多次用到,这里总结一下。
 
例如在Xcode中倒入一个SIPSKDK,如下,这里面包含了一个.a的静态库。
   技术分享
 
 如果直接运行的没用到里面方法的时候运行时没问题的,但是一旦导入头文件,并创建SIPClient对象的时候就会报错,如下所示:技术分享

这里报错的原因主要是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)

技术分享

这样运行就OK了。

 
 
 
第二种方法:
在集成第三方框架的时候 ,报了"_BIO_ctrl", referenced from:等一系列错误
  • 没有将两个.a文件拖入工程。

    技术分享
  • 2

    找到iOS DEMO,将上图红框框住的两个.a文件导入工程即可。

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