iOS开发 引用第三方库出现duplicat…

在iOS开发中, 难免会集成别人的三方类库, 当集成的三方类库过多时, 难免会出现某些库同时使用了同样的函数库,
导致link的时候报错提示duplicate symbol。详情见图:

引用第三方库出现duplicate symbol时的处理方法" TITLE="iOS开发 引用第三方库出现duplicate symbol时的处理方法" />

这样的报错让我们觉得很麻烦, 这样的文件重复错误, 不是由自己的程序中的代码造成的, 而是别人的三方类库, 也就是说,
这种情况下, 我们没有办法通过修改自己的代码而使问题得到解决。 我们就只能要求第三方(函数库的提供方)提供源码, 然后自己修改,
或者是让三方代码提供者自己修改了之后给我们, 不管怎样, 多少会觉得有点无理要求了。  
那么我们就只能想想办法自己解决了, 也就是修改.a文件或者framework中的二进制文件。

修改这样的错误, 我们需要用到lipo 和 ar 工具。
 不知道用法的可以网上稍微搜索一下。

那么我们现在就来修改一下吧。

一、找到重复的库文件(两个库文件重复找其中之一即可, 三个库文件, 找到重复文件的其中两个, .....以此类推),
你可以直接在该项目下的文件夹进行操作(不建议, 容易使程序出问题),你也复制这些库文件到其它文件夹进行操作。
我们这里复制到其它文件夹下进行操作。需要复制的文件见图:

引用第三方库出现duplicate symbol时的处理方法" TITLE="iOS开发 引用第三方库出现duplicate symbol时的处理方法" />

二、打开终端, 并cd 到文件夹下, 使用  lipo -info  
  ASIAIDCardReader (ASIAIDCardReader替换为自己的文件名称)
查看该文件下的架构信息, 留待后用

引用第三方库出现duplicate symbol时的处理方法" TITLE="iOS开发 引用第三方库出现duplicate symbol时的处理方法" />

三、我们可以看最后一行信息, 此处 Architectures
in the fat file, 说明此处是一个fat文件, 我们需要对该文件先进行瘦身, 即分离出
armv7、arm64和armv7s文件。

使用命令 lipo ASIAIDCardReader -thin armv7
-output ASIAIDCardReader.armv7 (ASIAIDCardReader.armv7 中ASIAIDCardReader 可替换为自己的文件名称,且该名称可以自定义), 使用类似的方法(只需要将 .armv7
修改为相应的架构信息后缀即可),分离出其它的文件

引用第三方库出现duplicate symbol时的处理方法" />

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

引用第三方库出现duplicate symbol时的处理方法" TITLE="iOS开发 引用第三方库出现duplicate symbol时的处理方法" />

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

引用第三方库出现duplicate symbol时的处理方法" TITLE="iOS开发 引用第三方库出现duplicate symbol时的处理方法" />

根据我们最开始的错误定位,从上面我们都能轻易找到重复的文件 AsyncSocket.o和AsyncSocket相关的文件,
接下来就是对分离出来的文件进行修改了。

五、使用命令 ar -d -sv ASIAIDCardReader.armv7s AsyncSocket.o,
即删除ASIAIDCardReader.armv7s
下的 AsyncSocket.o
二进制文件(你只需要替换成你自己的库文件名称和.o文件即可),同样对分离出来的.arm64、.armv7s进行同样的操作。

引用第三方库出现duplicate symbol时的处理方法" TITLE="iOS开发 引用第三方库出现duplicate symbol时的处理方法" />

六、文件修改好了, 接下来我们需要把修改好的文件,
全部再组合成我们原来的framework下的fat文件。使用命令

lipo
-create -output ASIAIDCardReader
ASIAIDCardReader.armv7s
ASIAIDCardReader.arm64 ASIAIDCardReader.armv7
(此处需要把所有分离出来的文件都加上)

为了使我们确认还原了ASIAIDCardReader文件, 我们将复制文件夹下的该文件删除, 再进行操作。
使用命令之后, 我们就能看到生成了一个新的 ASIAIDCardReader文件, 这就是我们修改之后,
符合我们需求的文件了。

七、将修改好的文件, 拖拽到原文件夹下,
替换原文件即可。

注:其它由重复的framework, 按照以上方法重复一遍即可。

好了, 按照这样的方法, 我解决了自己的问题, 有什么不对的地方, 还希望大家多多指点, 最后,
此教程借助博客:http://angelolloqui.com/blog/31-How-to-fix-a-Duplicated-Symbols-error-on-binary-files

时间: 2024-08-01 20:09:23

iOS开发 引用第三方库出现duplicat…的相关文章

iOS开发中常用第三方库的使用和配置-GDataXML

这篇文章旨在给自己以后需要时能及时的查到,省得每次都去baidu. 1. xml解析库-GDataXML 参考文章:http://blog.csdn.net/tangren03/article/details/7868246 GDataXML下载地址: (1)GDataXML.h/m文件 http://code.google.com/p/gdata-objectivec-client/source/browse/trunk/Source/XMLSupport/ (2)DGataDefines.h

iOS项目中引用第三方库引发冲突的解决方法

在iOS程序开发过程中,经常会碰见引用第三方库出现类名重复使用,导致冲突. 解决方案 1.使用命令将.a库中的相同的包移除 2.在编译链接项中添加-dead_strip项  补充说明: -dead_strip:删除多余的库符号: -all_load:让链接器把所有找到的目标文件都加载到可执行文件中: -force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径 使用命令将.a库中的相同的包移除步骤如下: 1.创建临时文件夹(用

ios 开发项目常用第三方库:

控件: pod 'ActionSheetPicker-3.0' //各种各样的选择器 pod 'MWPhotoBrowser' 相片浏览器 pod 'CYLTabBarController' //快速构建tabBarVC pod 'M13ProgressSuite' //实现各种样式进度条 pod 'SDCycleScrollView' //轮播图 工具类: pod 'Masonry' //布局 pod 'MJExtension' //json 转model pod 'IQKeyboardMan

IOS 编程中引用第三方的方类库的方法及常见问题

方法一:直接复制所有源文件到项目中 这种方法就是把第三方类库的所有源文件复制到项目中,直接把所有.h和.m文件拖到XCode项目中即可. 注意: 1. 如果第三方类库引用了一些系统自带类库,那么在项目中还需要额外引用那些类库. 2. 如果当前的项目启用了ARC,而引用的第三方类库未使用ARC,那还需要在项目信息的Targets – Build Parses 里找到第三方类库的.m文件,并为它们加上-fno-objc-arc标记. 3. 对于在未启用ARC的项目用引用使用了ARC的第三方类库,则需

IOS学习:常用第三方库(GDataXMLNode:xml解析库)

IOS学习:常用第三方库(GDataXMLNode:xml解析库) 分类: ios开发学习2013-05-30 09:45 4443人阅读 评论(0) 收藏 举报 iOSXMLGDataXMLNode 一.GDataXMLNode说明 GDataXMLNode是Google提供的用于XML数据处理的类集.该类集对libxml2--DOM处理方式进行了封装,能对较小或中等的xml文档进行读写操作且支持XPath语法. 使用方法: 1.获取GDataXMLNode.h/m文件,将GDataXMLNo

iOS开发之常用第三方框架(下载地址,使用方法,总结)

iOS开发之常用第三方框架(下载地址,使用方法,总结) 说句实话,自学了这么久iOS,如果说我不知道的但是又基本上都摸遍了iOS相关知识,但是每次做项目的时候,遇到难一点的地方或者没试过的东西就闷了. 比如这次,打算做一个着手做一个iOS的项目,是一个关于日计划的小软件,界面都其他的都算满意,网络就不说了,没有服务器,所以很多数据相关的功能不无法实现. 但是嘴头疼的事情就是,比如遇到一个功能的时候,其实如果说要实现的话还是可以的,但是每次在我实现之后我总会想到,这么实现更好,这么实现更简单,更加

CocoaPods 引用第三方库导致的模拟器可以运行,但是真机不可以运行问题。

Most headache is not code issue, but compile problem 对于 iOS 的编译机制,暂时不是了解太多,不过,知识是一个积累的过程,以后会把编译方面以及第三方管理工具或者路径设置等等问题放在这里. 先上 stackoverflowe 链接 http://stackoverflow.com/questions/25298957/cocoapods-can-not-build-a-arm-file-of-type-a-ld-library-not-fou

iOS开发拓展篇—静态库

iOS开发拓展篇—静态库 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开源库 公开源代码,能看到具体实现 比如SDWebImage.AFNetworking (2)闭源库 不公开源代码,是经过编译后的二进制文件,看不到具体实现 主要分为:静态库.动态库 二.静态库和动态库 1.静态库和动态库的存在形式 静态库:.a 和 .framework 动态库:.dylib 和 .framework 2.静态库和动

cocos2d-x 3.0 引用第三方库 及编译成apk时android mk文件写法

cocos2d-x 3.0 中,如果你需要使用CocosStudio.Extensions扩展库 等等,都需要自己手动添加. 添加步骤如下:(比如说现在我要添加libExtensions,libCocosStudio , libGUI) 1.添加附加项目 右击解决方案--->添加现有项目--->添加:项目目录\cocos2d\extensions\proj.win32\libExtensions,然后你会发现左边多了一个libExtensions扩展库 右击解决方案--->添加现有项目-