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

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

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

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

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

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

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

iOS开发 引用第三方库出现duplicate symbol时的处理方法的更多相关文章

  1. iOS程序开发引用的第三方库之间出现duplicate symbol时的处理方法

    iOS程序集成的第三方库过多时,很容易出现某几个库同时用到了一样的函数库,也就是在你的程序link时会提示duplicate symbol,而重复的符号又不是由你自己程序的代码造成的,也就说没法通过直 ...

  2. iOS开发常用第三方库

    UI 动画 网络相关 Model 其他 数据库 缓存处理 PDF 图像浏览及处理 摄像照相视频音频处理 响应式框架 消息相关 版本新API的Demo 代码安全与密码 测试及调试 AppleWatch ...

  3. ios开发必备第三方库

    引言 作为iOS开发人员,在开发App的过程中怎么会不使用第三方库呢?相信没有App是不使用第三方库的! 网络库 网络库,这是开发必备,除非你的App玩单机.现在特别火也特别好用的网络库就数AFNet ...

  4. iOS开发之第三方库的学习--hpple的使用

    前言:因为在开发中很可能会遇到html解析,如果后台提供的数据只有html数据,或者开发的app需要从web前端的html里获取数据,就需要html解析工具了. 关于HTML解析库,可以阅读:收集几个 ...

  5. iOS开发——导入第三方库引起的unknown type name 'NSString'

    今天加入SVProgressHUD的第三方库的时候报了24个错误( too many errors emitted, stopping now),都是 expected identifier or ' ...

  6. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  7. xcode引入第三方静态类库 duplicate symbol _OBJC_XXX 重复编译错误

    xcode引入第三方静态类库 duplicate symbol _OBJC_XXX 重复编译错误 一:场景 xcode 同时引入了 libA.a, libB.a 两个静态类库,如果 这两个静态类库之中 ...

  8. 基于QT开发的第三方库

    基于Qt开发的第三方库 分类: Qt2014-02-12 11:34 1738人阅读 评论(0) 收藏 举报 QT第三方库   目录(?)[+]   文章来源:http://blog.csdn.net ...

  9. 李洪强iOS开发之静态库的打包一

    李洪强iOS开发之静态库的打包一 //静态库一般做一下几种事情 //1 工具类 算法逻辑 新建工具类LHQTools 定义类方法 + (NSInteger)sumWithNum1: (NSIntege ...

随机推荐

  1. Unit Of Work的设计

    在DDD开发过程中,一个良好的Uow设计必不可少,我心目中的Uow设计应该具备以下几点: 1.有着良好的抽象,有着恰如其分的命名: 2.能够应付不同的组件,比如你的系统中可能会存在EfUnitOfWo ...

  2. Hbase学习笔记01

    最近做项目接触到了HDFS.mapreduce以及Hbase,有了实战机会,今天打算将这些知识好好总结下,以备不时之需.首先从Hbase开始吧. Hbase是建立在HDFS上的分布式数据库,下图是Hb ...

  3. Apache2.4卡住无法访问的解决……

    早两个星期,搭建了一个项目管理平台--<如何安装一个优秀的BUG管理平台--真的是手把手教学!>.以前都是用apache2.2的,这次换了apache2.4.安装起来是没有问题的,结果运行 ...

  4. 创建DbContext

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 上一篇介绍了<创建实体>,这一篇我们顺其自然地介绍<创建DbContext>. 温故: 提到DbConte ...

  5. HTML (超文本标记语言)

    <html> --开始标签 <head> 网页上的控制信息 <title>页面标题</title> </head> <body> ...

  6. Math.random()

    Math.random() 日期时间函数(需要用变量调用):var b = new Date(); //获取当前时间b.getTime() //获取时间戳b.getFullYear() //获取年份b ...

  7. 关于百度编辑器UEditor的一点说明

    大家在使用的时候要特别注意editor_config.js中的“URL”这个参数 我的理解:1.这个参数是editor整个结构的总路径          2.首先要把这个路径配置好了.才能正常的显示, ...

  8. JQuery 滚动条插件perfect-scrollbar

    原文地址 https://github.com/noraesae/perfect-scrollbar perfect-scrollbar Tiny but perfect jQuery scrollb ...

  9. 第二章 consul的安装和启动

    安装环境: mac:64bit(查看mac位数:打开终端-->"uname -a") consul_0.6.4_darwin_amd64.zip和consul_0.6.4_w ...

  10. linux mount/umount挂载命令解析。

    如果想在运行的Linux下访问其它文件系统中的资源的话,就要用mount命令来实现. 2.      mount的基本用法是?格式:mount [-参数] [设备名称] [挂载点] 其中常用的参数有: ...