framework 解决duplicate symbol 冲突

    在制作framework中,如果导入的第三方库和项目中引入的第三方库相同,会出现duplicate symobol 的错误,这时候在已知两个库引用的文件相同的情况下,我们可以自行的去切除其中一个,而确保项目中的编译.o文件唯一。
   方法如下:
   在终端中,使用lipo 对静态库进行拆分(.a 或者framework 包内的同名文件)

1、 lipo -info xxx . 查看文件是否是fat文件,支持处理器类型
2、lipo xxx -thin 类型 -output 类型文件名 . 把文件拆分成不同类型的thin文件
3、ar -d 类型文件名 重复的.o文件 . 删除重复的编译文件
4、 lipo -create 类型文件名... 类型文件名 -output 库名 。 合并成fat文件

    当然这是无奈之举,造成这样的原因是在 build settings 中的 other linker flags 中使用了-all_load 导致的。
    我们在制作静态库的时候,有时候免不了要对类的方法做扩展。
    如果是objective-C的代码,需要添加-objc。
    如果需要链接静态库的所有的代码到app,需要添加-all_load。
    正因为_all_load导入过于暴力,所以就导致了这种情况发生。

比较明智点的做法,如果必须要链接代码到app,是通过-force_load,链接指定静态库中的所有代码到app。
当然也是相对比较暴力的方法,如果真的是对库的大小有偏执狂的,可以参考stackoverflow,使用伪符号,来加载类的扩展。
https://stackoverflow.com/questions/2567498/objective-c-categories-in-static-library/22264650#22264650

你可能感兴趣的:(framework 解决duplicate symbol 冲突)