IOS 开发中遇到 duplicate symbol 解决方案

项目中需要引入第三方库,并且Xcode升级到了7.1,然后发现出现了近2000过个duplicate symbol的错误提示,仔细查看定位到两个.a文件,有很多的.o文件冲突了。

因为这两个是第三方的,自己没法修改,所以求助网络资料,得出下列两种解决方案。

方案一:修改other linker flag

在Build Settings->Other link flags中删除所有的-all_load与-force_load

方案一结果:没有解决我项目上的问题

据我所知,方案一可以解决部分duplicate symbol的错误提示的,但是我的项目上仍有错误提示继续存在。然后我试了stackoverflow上国外大神的暴力解决方案。

方案二:使用libtool, lipo工具解压合并

方案二简单直接暴力,对我刚学IOS开发的启发很大。

方法详解:进入终端,并且进入工程目录(或者自己将冲突的.a单独拷贝出来)

1. $ lipo -info libTapjoy.a

Architectures in the fat file: libxxxx.a are: armv64 i386 armv7 x86_64 ...

 这行命令是查看.a文件支持的架构,可能出现的是不同.a有不同的架构。

 我们得到了.a支持的架构之后就需要解压他。

2. $ lipo -extract_family armv7 -output libxxxx-armv6.a libxxxx.a

 $ mkdir armv7

$ cd armv7

$ ar -x ../libxxxx-armv7.a 

 这几行命令是,将libxxxx.a中的 armv7框架部分解压出,建立一个armv7文件夹,进入这个文件夹,将上面解压出的libxxxx-armv6.a解压在armv7文件夹中。

 

解压后是这样的。。。

重点来了,现在只是解压了冲突的其中一个.a,所以现在 需要按上面的步骤再将另一个.a一样操作。

3.$ libtool -static -o ../lib-armv7.a *.o

做完第二步,两个.a文件的armv7框架就在一个文件夹下了,这时候,我注意到里面有一个.o文件是和我工程中的一个工具类是重复的,并且在报错中也有这个工具类的提示,我将其中的.o删掉,检查之后就可以将所有的.o文件合并了,$ libtool -static -o ../lib-armv7.a *.o 就是将.o文件合并。

完了?还没。。。 第一步中 Architectures in the fat file: libxxxx.a are: armv64 i386 armv7 x86_64 ...可以看出,libxxxx.a有多重框架,我们需要按照上面的步骤将其支持的所有框架都进行合并。

 也就是说我们需要 lib-armv7.a lib-arm64.a lib-i386.a lib-x86_64.a...这几个,或者更多。。。

4. $ lipo -create -output lib.a lib-armv7.a lib-i386.a lib-x86_64.a lib-arm64.a

 在最后我们将所有合并完的不同框架的.a文件合并成我们要用的lib.alib.a...导进去试试吧。。。

最后,我在解压还有合并arm64时遇到了问题,解压出arm64框架是,终端报错了。。。所以我换了一种解压方式,我叫他瘦身命令。。。

瘦身命令是:

$ lipo -thin arm64 libxxxx.a -output libxxxx-arm64.a如果大家遇到也可以试试。。。导入工程后,瞬间清爽了。。。。这里感谢http://www.cnblogs.com/wengzilin/p/3734751.html 博主大神的博客。。。
时间: 2024-10-05 05:04:57

IOS 开发中遇到 duplicate symbol 解决方案的相关文章

iOS开发-编译时Duplicate Symbol Error

今天对原来项目文件进行重新整理,根据文件内容进行分类,结果复制粘贴时没注意把一个文件复制了两遍 编译的时候就出现Duplicate Symbol Error 在网上搜素了一圈发现也有人遇到过这个问题,看了下问题的答案后找到了问题所在 http://stackoverflow.com/questions/2264455/iphone-duplicate-symbol-error

【三分钟视频教程】iOS开发中 Xcode 报 apple-o linker 错误的#解决方案#

[三分钟视频教程]iOS开发中 Xcode 报 apple-o linker 错误的#解决方案# [三分钟视频教程]iOS开发中 Xcode 报 apple-o linker 错误的#解决方案#,布布扣,bubuko.com

iOS开发中遇到的一些问题及解决方案【转载】

iOS开发中遇到的一些问题及解决方案[转载] 2015-12-29 [385][scrollView不接受点击事件,是因为事件传递失败] // //  MyScrollView.m //  Created by beyond on 15/6/6. //  Copyright (c) 2015年 beyond.com All rights reserved. //  不一定要用继承,可以使用分类 #import "MyScrollView.h" #import "CoView.

【转】XCode: duplicate symbol 解决方案

遇到引用库重复定义的问题,需要解决. 项目需要,同时引用ZBar和QQ授权登录SDK,由于二者均使用了Base64处理数据,XCode编译时报错: duplicate symbol _base64_encode in: ...\libzbar.a(symbol.o) ...\TencentOpenAPI(base64.o) 意思就是在这两个库中都定义了_base64_encode,编译器认为你重复定义了.至于为什么编译器认为重复定义,个人认为编译器编译全局变量时会根据名字进行编译,会把相同名称的

iOS开发——淫技篇&iOS开发中各种淫技总结(六)

iOS开发中各种淫技总结(六) swift中指针的使用 在 Swift 中,指针都使用一个特殊的类型来表示,那就是 UnsafePointer<T>.遵循了 Cocoa 的一贯不可变原则,UnsafePointer<T> 也是不可变的.当然对应地,它还有一个可变变体,UnsafeMutablePointer<T>.绝大部分时间里,C 中的指针都会被以这两种类型引入到 Swift 中:C 中 const 修饰的指针对应 UnsafePointer (最常见的应该就是 C

ios开发中遇到的问题和解答汇总

如何让一个数组中的字典,如果字典中有重复的id.将重复的id的字典进行数组整合....<点击查看详情>iOS UIView 创建是不是都会经过initWithFrame?<点击查看详情>iPad 9.1系统上键盘响应很慢<点击查看详情>ios如何绑定数据?<点击查看详情>iOS开发,我想上传一个.gsd的文件(或者stl),请问该怎么做<点击查看详情>iOS NSTimer问题<点击查看详情>iOS大部分积分墙软件为啥都做基于Safa

iOS开发中的ARC内存管理de技术要点

本文旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇文章不是一篇标准的ARC使用教程,并假定读者已经对ARC有了一定了解和使用经验.详细的关于ARC的信息请参见苹果的官方文档与网上的其他教程:) 本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging ARC的本质 ARC是编译器(时)特性,而不是运行时

浅谈iOS开发中的对象归档

iOS提供的数据持久化方式有:SQLiteCoreData属性列表.NSUserDefault对象归档. 这里来简单介绍下iOS开发中的对象归档: 对象归档是将对象归档以文件的形式保存到磁盘中(也称为序列化,持久化)使用的时候读取该文件的保存路径读取文件的内容(也称为接档,反序列化) 对象归档的文件是保密的磁盘上无法查看文件中的内容,而属性列表是明文的可以查看) 对象归档有两种方式:1.对foundat中对象进行归档     2.自定义对象归档 1.简单对象归档 使用两个类:NSKeyedA r

iOS开发中的错误整理,百思项目&#39;我的&#39;模块,tableFooterViewHeight的问题.提醒自己对KVO和Block的运用欠缺

一.错误分析:由于tableFooterView中的数据是通过请求服务器后得到的,tableFooterViewHeight也是根据请求过来的数据经过布局子控件而计算出来的.(注意:计算高度是在子线程中执行的),导致了给TableView设置了tableFooterView,tableFooterView的高度为0.如下图: 二.解决方案一:通过KVO监听自定义tableFooterView的高度变化 解决方案二:通过block,当自定义tableFooterView计算出高度后,才将自定义控件