项目中需要引入第三方库,并且Xcode升级到了7.1,然后发现出现了近2000过个duplicate symbol的错误提示,仔细查看定位到两个.a文件,有很多的.o文件冲突了。
因为这两个是第三方的,自己没法修改,所以求助网络资料,得出下列两种解决方案。
方案一:修改other linker flag
在Build Settings->Other link flags中删除所有的-all_load与-force_load
方案一结果:没有解决我项目上的问题
据我所知,方案一可以解决部分duplicate symbol的错误提示的,但是我的项目上仍有错误提示继续存在。然后我试了stackoverflow上国外大神的暴力解决方案。
方案二:使用libtool, lipo工具解压合并
方案二简单直接暴力,对我刚学IOS开发的启发很大。
方法详解:进入终端,并且进入工程目录(或者自己将冲突的.a单独拷贝出来)
1. $ lipo -info libTapjoy.a
Architectures in the fat file: libxxxx.a are: armv64 i386 armv7 x86_64 ...
这行命令是查看.a文件支持的架构,可能出现的是不同.a有不同的架构。
我们得到了.a支持的架构之后就需要解压他。
2. $ lipo -extract_family armv7 -output libxxxx-armv6.a libxxxx.a
$ mkdir armv7
$ cd armv7
$ ar -x ../libxxxx-armv7.a
这几行命令是,将libxxxx.a中的 armv7框架部分解压出,建立一个armv7文件夹,进入这个文件夹,将上面解压出的libxxxx-armv6.a解压在armv7文件夹中。
解压后是这样的。。。
重点来了,现在只是解压了冲突的其中一个.a,所以现在 需要按上面的步骤再将另一个.a一样操作。
3.$ libtool -static -o ../lib-armv7.a *.o
做完第二步,两个.a文件的armv7框架就在一个文件夹下了,这时候,我注意到里面有一个.o文件是和我工程中的一个工具类是重复的,并且在报错中也有这个工具类的提示,我将其中的.o删掉,检查之后就可以将所有的.o文件合并了,$ libtool -static -o ../lib-armv7.a *.o 就是将.o文件合并。
完了?还没。。。 第一步中 Architectures in the fat file: libxxxx.a are: armv64 i386 armv7 x86_64 ...可以看出,libxxxx.a有多重框架,我们需要按照上面的步骤将其支持的所有框架都进行合并。
也就是说我们需要 lib-armv7.a lib-arm64.a lib-i386.a lib-x86_64.a...这几个,或者更多。。。
4. $ lipo -create -output lib.a lib-armv7.a lib-i386.a lib-x86_64.a lib-arm64.a
在最后我们将所有合并完的不同框架的.a文件合并成我们要用的lib.alib.a...导进去试试吧。。。
最后,我在解压还有合并arm64时遇到了问题,解压出arm64框架是,终端报错了。。。所以我换了一种解压方式,我叫他瘦身命令。。。
瘦身命令是:
$ lipo -thin arm64 libxxxx.a -output libxxxx-arm64.a如果大家遇到也可以试试。。。导入工程后,瞬间清爽了。。。。这里感谢http://www.cnblogs.com/wengzilin/p/3734751.html 博主大神的博客。。。