IOS 开发中遇到 duplicate symbol 解决方案

IOS 开发中遇到 duplicate symbol 解决方案

项目中需要引入第三方库,并且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 博主大神的博客。。。

 

 
 
 
 
posted @ 2015-12-07 10:58  小虎叫我大狗熊  阅读(401)  评论(0编辑  收藏  举报