iOS程序开发引用的第三方库之间出现duplicate symbol时的处理方法
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?
iOS程序开发引用的第三方库之间出现duplicate symbol时的处理方法的更多相关文章
- iOS开发 引用第三方库出现duplicate symbol时的处理方法
该篇文章是我自己从我的新浪博客上摘抄过来的, 原文链接为: http://blog.sina.com.cn/s/blog_dcc636350102wat5.html 在iOS开发中, 难免 ...
- Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录
第一步:下载第三方库,点击 连接 下载, 第二部:准备数据库:按照连接&中博客的步骤实现数据库, 数据库的设计大致如下表: id username pas ...
- ios程序开发杂记
ios程序开发杂记 一.程序构建 与一般的程序构建无太大区别,都是源文件编译链接这一套,通常是在mac上做交叉编译,也就是利用xcode里带的ios编译工具集去生成arm架构的ios程序(或是x86的 ...
- iOS项目开发常用功能静态库
YHDeveloperTools iOS项目开发常用功能静态库 查看源码 功能方法: 1.字符检查 [NSString checkStringWithType:Email andTargetStrin ...
- 可能对Flutter应用程序开发有用的代码/库/专有技术列表
当我开始使用Flutter实施该应用程序时,我开始担心“如何最好地编写?”以及“如何使其更好地放置?”. 在这种情况下,您将需要参考GitHub上发布的代码和应用程序. 因此,我收集了似乎对Flu ...
- iOS 常用的几个第三方库
网络通信 1.ASIHTTPRequest 这是一个经典的老库,功能完全而强大,但已经停止更新很久了(iOS5.0停止更新,但是我最近看github上这个项目有新改动).在不同iOS版本上略微有一些小 ...
- iOS真机调试引入第三方库(如友盟等)编译时候,出现错误提示
用Xcode 7 beta 3在真机(iOS 8.3)上运行一下工程,结果发现工程编译不过.看了下问题,报的是以下错误: MARK:解决方法:在building Setting 中设置bitCode ...
- 02-第一个iOS程序-开发步骤
打开Xcode 选择项目模板 Single View Application是最适合初学者的模板 设置项目属性 运行程序 不管怎样,先运行第一个iOS程序看看效果先(用快捷键Command + R 也 ...
- iOS开发系列--IOS程序开发概览
概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的 ...
随机推荐
- careercup-数组和字符串1.4
1.4 编写一个方法,将字符串中的空格全部替换为“%20“.假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的”真实“长度. C++实现代码: #include<iostream> ...
- React Native Tips
1. 检查连接的android设备 android devices 2. 启动android studio android 3. 摇动手机选开发模式,填入server的ip和port 4. Parse ...
- CXF整合Spring开发WebService
刚开始学webservice时就听说了cxf,一直没有尝试过,这两天试了一下,还不错,总结如下: 要使用cxf当然是要先去apache下载cxf,下载完成之后,先要配置环境变量,有以下三步: 1.打开 ...
- 设计模式——工厂模式 (C++实现)
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累. ...
- Java基础知识强化之网络编程笔记09:TCP之客户端键盘录入服务器写到文本文件中
1. TCP之客户端键盘录入服务器写到文本文件中 (1)客户端: package cn.itcast_09; import java.io.BufferedReader; import java.io ...
- Unity3D获取当前键盘按键
获取当前键盘按键,代码如下: using UnityEngine; using System.Collections; public class GetCurrentKey : MonoBehavio ...
- CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\d29b5393\123c3a1c\App_Code.odl3w4o6.dll”--“拒绝访问。 ”
IIS部署网站或者Webservice时,出现以下问题: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Tempor ...
- Java 文件下载
public HttpServletResponse download(String path, HttpServletResponse response) { try { // path是指欲下载的 ...
- C#基础加强
1.代码规范 -命名规范:定义的变量或者方法名要有意义. 1.骆驼命名 :第一个单词首字母小写,之后的单词首字母大写 userName.userPassword.realName…(普通变量(局部变量 ...
- 如何在 Debian / Ubuntu 服务器上架设 L2TP / IPSec VPN
本站的 Rio 最近在一台 Ubuntu 和一台 Debian 主机上配置了 L2TP / IPSec VPN,并在自己的博客上做了记录.原文以英文写就,我把它大致翻译了一下,结合我和 Rio 在设置 ...