iOS开发 引用第三方库出现duplicate symbol时的处理方法

 
该篇文章是我本身从个人新浪博客上摘抄过来的, 原文连接为:  http://blog.sina.com.cn/s/blog_dcc636350102wat5.html
 
 
在iOS开发中, 不免会集成别人的三方类库, 当集成的三方类库过多时, 不免会出现某些库同时使用了一样的函数库,致使link的时候报错提示duplicate symbol。详情见图:
 


 
这样的报错让咱们以为很麻烦, 这样的文件重复错误, 不是由本身的程序中的代码形成的, 而是别人的三方类库, 也就是说,这种状况下, 咱们没有办法经过修改本身的代码而使问题获得解决。 咱们就只能要求第三方(函数库的提供方)提供源码, 而后本身修改,或者是让三方代码提供者本身修改了以后给咱们, 无论怎样, 多少会以为有点无理要求了。  那么咱们就只能想一想办法本身解决了, 也就是修改.a文件或者framework中的二进制文件。
 
修改这样的错误, 咱们须要用到lipo 和 ar 工具。 不知道用法的能够网上稍微搜索一下。
 
那么咱们如今就来修改一下吧。
 
 
1、找到重复的库文件(两个库文件重复找其中之一便可, 三个库文件, 找到重复文件的其中两个, .....以此类推),你能够直接在该项目下的文件夹进行操做(不建议, 容易使程序出问题),你也复制这些库文件到其它文件夹进行操做。咱们这里复制到其它文件夹下进行操做。须要复制的文件见图:


 
2、打开终端, 并cd 到文件夹下, 使用  lipo -info    ASIAIDCardReader (ASIAIDCardReader替换为本身的文件名称)查看该文件下的架构信息, 留待后用
 
 
3、咱们能够看最后一行信息, 此处 Architecturesin the fat file, 说明此处是一个fat文件, 咱们须要对该文件先进行瘦身, 即分离出armv七、arm64和armv7s文件。   
使用命令 lipo ASIAIDCardReader -thin armv7-output ASIAIDCardReader.armv7 (ASIAIDCardReader.armv7 中ASIAIDCardReader 可替换为本身的文件名称,且该名称能够自定义), 使用相似的方法(只须要将 .armv7修改成相应的架构信息后缀便可),分离出其它的文件
 


4、文件已经分离出来, 下面咱们使用ar 工具, 查看各文件下的二进制文件(.o文件)。 此处咱们可使用 ar -t在终端中查看全部的.o文件


 也可使用 ar -x将全部.o文件分离到指定的目录文件夹。


根据咱们最开始的错误定位,从上面咱们都能轻易找到重复的文件 AsyncSocket.o和AsyncSocket相关的文件,接下来就是对分离出来的文件进行修改了。
 
 
5、使用命令 ar -d -sv ASIAIDCardReader.armv7s AsyncSocket.o,即删除ASIAIDCardReader.armv7s下的 AsyncSocket.o二进制文件(你只须要替换成你本身的库文件名称和.o文件便可),一样对分离出来的.arm6四、.armv7s进行一样的操做。 
 


 
6、文件修改好了, 接下来咱们须要把修改好的文件,所有再组合成咱们原来的framework下的fat文件。使用命令 
 lipo-create -output ASIAIDCardReaderASIAIDCardReader.armv7sASIAIDCardReader.arm64 ASIAIDCardReader.armv7(此处须要把全部分离出来的文件都加上)
为了使咱们确认还原了ASIAIDCardReader文件, 咱们将复制文件夹下的该文件删除, 再进行操做。使用命令以后, 咱们就能看到生成了一个新的 ASIAIDCardReader文件, 这就是咱们修改以后,符合咱们需求的文件了。 
 
7、将修改好的文件, 拖拽到原文件夹下,替换原文件便可。 
 
注:其它由重复的framework, 按照以上方法重复一遍便可。
 
好了, 按照这样的方法, 我解决了本身的问题, 有什么不对的地方, 还但愿你们多多指点, 最后,此教程借助博客:http://angelolloqui.com/blog/31-How-to-fix-a-Duplicated-Symbols-error-on-binary-files
相关文章
相关标签/搜索