iOS程序集成的第三方库过多时,很容易出现某几个库同时用到了一样的函数库,也就是在你的程序link时会提示duplicate symbol,而重复的符号又不是由你自己程序的代码造成的,也就说没法通过直接修改代码把重复的符号去掉!这样呢,要不就要求第三方库提供方该代码,要不就自己修改第三方库的库文件。第一种方法多少有点无理要求,所以还是直接用第二种方法自己解决了吧,也就是直接修改.a文件或framework里的库二进制文件:
这里我只列出针对.a文件的处理方法,framework操作过程类似。
开console,找到要解剖的.a文件,执行下列命令查看库包含的cpu架构代码:
lipo -info libx.a
Architectures in the fat file: libx.a are: i386 armv6 armv7
然后用 lipo -extract_family armv6 -output libx-inter.a libx.a
分离出arm版本的.a,这里有个小问题,按我的理解此命令应该对包含3种cpu代码的.a里的armv6部分进行操作,而实际分离出来的.a却是同时包含armv6和armv7的部分,也就是依然是”fat” lib,这样是不能抽出.o的,因此还需要进行以下操作:
lipo libx-inter.a -thin armv6 -output libx-armv6.a lipo libx-inter.a -thin armv7 -output libx-armv7.a
这样就能分离出2份不同版本arm的.a了,然后进行解.o操作:
ar -x libx-armv6.a
这部操作最好放到单独的文件夹里进行,会将link出.a的所有.o还原出来,然后有两种选择:一是把所有库对应cpu架构的部分都还原到这个位置,然后将重复的部分合并为一份,接着用后面的命令将所有.o再合并为一份公共lib。还有一种选择就是保留重复符号中的一份lib完好如初,将其余lib单独解开,剔出重复符号存在的.o,然后将该lib重新link回.a,以去除重复符号。
不管用哪种方法解决,最后的link回命令如下:
libtool -static -o ../libx-armv6.a *.o
当然,别忘了咱们的库都是有多份cpu架构指令的,所以,先要对每种cpu arch的库进行同样操作,然后还要将thin lib合并回fat lib:
lipo -create -output libx.a libx-armv6.a libx-i386.a libx-armv7.a
这样,再link回自己的app时就不会再出现duplicate symbol了。
参考文章:
- http://bbs.51cto.com/topic/thread-845884.html 使用多个第三方库出现duplicate symbol的解决办法
- http://stackoverflow.com/questions/5352113/how-do-i-turn-a-fat-library-into-a-non-fat-library How do I turn a “fat” library into a “non-fat” library?
博主友情提示:
如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。
我执行libtool -static -o ./libemparmv7.a *.o的时候报了下面的错:libtool: object: ASIAuthenticationDialog.o malformed object (unknown load command 1)libtool: object: ASIHTTPRequest.o malformed object (unknown load command 1)。。。求救~~
请问你的XCode Command Line Tools是否是比较新的版本?命令行工具版本过旧可能会导致这个问题,试下更新最新版本的XCode并重新安装命令行工具看看。
解决没? 怎么解决的 我也是这个问题
你好,可以试下更新Xcode的命令行工具看
我换成XCode4.6.1之后,原来那个问题没有了。但是又有了下面这个新问题:$ libtool -static -o ../libx-tttt.a *.olibtool: file: norm_l.o has no symbolslibtool: file: norm_s.o has no symbols这又是怎么回事呀?
执行完了是否成功生成.a?我查了下这个”has no symbols”好像只是提示性质,不是错误提示。
楼主解决了这个问题吗?我也遇到了
您好,请问为什么我卡在第一步了,终端顶部一直在显示liop和xcrun,一直在闪,一直在运行lipo -info libsqlcipher.a
你好,请问“一直在闪”的是在执行lipo时报错还是根本无法执行?另外,可以试试更新新版的Xcode以及附带的Command Line Tools
没有报错,就是一直在执行,但是执行了很久也没执行完,请问这第一步需要很久么 (公司要求用的事xcode4.6,因为原来的项目太复杂,没办法改)
不会很久,立即返回,-info就是查询fat lib中整合的所有cpu指令集的库用的。或者你可以试试直接-extract_family提取,看看是否也是这样,如果是的话可能就是工具环境有问题了
请问您能加一下我的qq么 问您一些问题 (周六日肯定不会打搅您 ) 619654584
好的,已经加了
我这边也遇到了类似的问题,我把两个库的armv7都分别剥离了出来,但是如何合并却不得其法,我用beyond compare比较了两个文件夹,发现很多同名的.o文件都是红色的,那我如何合并呢?方便的话能否给我一下您的qq便于请教。
这个主要是看主程序链接时重复符号的所在,针对重复符号的.o做处理,同名.o不一样可能是编译参数稍有不同,或者编译器不同等编译期差别所致,当然也有可能就是源码不一样,这种我觉得就得从合并后的程序功能是否正常来判断了。