使用ar命令删除iOS静态库重复编译的.o文件
关于 xcode引入第三方静态类库 duplicate symbol _OBJC_XXX 重复编译错误
看这里 http://www.cnblogs.com/cocoajin/p/3917709.html
之前提到了两种方式;
一种是修改xcode编译选项;一种是在打包时去掉一方;
今天有第三种方式;
直接使用ar命令在其中一个包中删除指定的重复编译的.o文件;
如下场景演示
静态库libTaobao.a 里面编译有CEO.m 文件并且有 ceo方法

静态库libBaidu.a 里编译有CEO.m 文件并且有ceo方法

那么当上面的两个静态库出现在同一个项目中时,并且other link flag 为 -all_load时,就会出重复编译错误!

从上图我们可以看出就是CEO.o 这个文件重复编译了,那么从上面两个库其中任意一个去掉即可
本次的解决思路:
1. 使用lipo 分别将.a拆分
2. 使用ar命令删除其中一个.a的冲突的.o
3. 使用lipo 合并
如下演示,

cocoaPro:lib-taobao cocoajin$ ls
libTaobao.a
cocoaPro:lib-taobao cocoajin$ lipo -info libTaobao.a
Architectures in the fat file: libTaobao.a are: armv7 arm64
cocoaPro:lib-taobao cocoajin$ lipo libTaobao.a -thin armv7 -output tbv7.a
cocoaPro:lib-taobao cocoajin$ lipo libTaobao.a -thin arm64 -output tb64.a
cocoaPro:lib-taobao cocoajin$ ls
libTaobao.a tb64.a tbv7.a
cocoaPro:lib-taobao cocoajin$ lipo -info tb*
input file tb64.a is not a fat file
input file tbv7.a is not a fat file
Non-fat file: tb64.a is architecture: arm64
Non-fat file: tbv7.a is architecture: armv7
cocoaPro:lib-taobao cocoajin$ ar -d tbv7.a CEO.o
cocoaPro:lib-taobao cocoajin$ ar -d tb64.a CEO.o
cocoaPro:lib-taobao cocoajin$ lipo -create tbv7.a tb64.a -output libTaobao.a
cocoaPro:lib-taobao cocoajin$ lipo -info libTaobao.a
Architectures in the fat file: libTaobao.a are: armv7 arm64
cocoaPro:lib-taobao cocoajin$
最后替换去掉CEO.o的库之后,工程编译通过,运行正常!

使用ar命令删除iOS静态库重复编译的.o文件的更多相关文章
- iOS - 静态库的导入和头文件路径的设置
开发过程中,免不了要用到一些第三方或者是别人写好的一些Demo,这时就经常会用到别人写的一些静态库(.a文件)和n多个头文件(.h文件),这些文件不是简单地把它们拉到自己的工程里面就行的,还要设置一些 ...
- iOS 静态库,动态库与 Framework 浅析
静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人 ...
- iOS静态库.a总结(2017.1.24增加脚本打包方法)
修改于:2017.1.24 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.根据源代码的公开情况,库可以分为2种类型 a.开源库 公开源代码,能看到具体实现 ,比如SDWebImag ...
- iOS静态库相关-封装lib
来源:http://blog.csdn.net/zsomsom/article/details/9163635 Library介绍 基本知识 在实际的编程过程中,通常会把一些公用函数制成函数库,供其它 ...
- iOS 静态库,动态库与 Framework
iOS 静态库,动态库与 Framework 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢 ...
- iOS - 静态库的创建与使用
在日常项目开发中,不论是为了两个公司项目上的业务交流还是为了减少项目的编译时间,有的时候我们会把项目中的私密内容打包成静态库,或者是把项目中变动较少一部分打包成静态库以便提高编译效率,那么下面我们就来 ...
- IOS静态库
如何在Xcode中创建C++静态库 http://jingyan.baidu.com/article/03b2f78c111fca5ea237ae26.html iOS 如何创建和使用静态库 http ...
- iOS静态库小结--(yoowei)
准备知识: 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.根据源代码的公开情况,库可以分为2种类型 a.开源库 公开源代码,能看到具体实现 ,比如SDWebImage.AFNetw ...
- iOS静态库.a文件制作和导入使用
iOS静态库.a文件制作: 1.新建Cocoa Touch Static Library工程 新建工程 - 选择iOS-FrameWork&Libary,选择 Cocoa Touch Stat ...
随机推荐
- js实现元素边框闪烁功能
<body> <input type="text" value="test" onclick="flash(this)"& ...
- MUI 页面传值 webview
我们假设a.html 和b.html a.html 页面代码 <!DOCTYPE html> <html> <head> <meta charset=&quo ...
- spring,mybatis事务管理配置与@Transactional注解使用[转]
spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是至关 ...
- VS为VC++添加UAC控制(VC程序默认管理员运行)
1.VS编译链接VC++工程生成文件默认是没有管理员权限的 生成的程序图标是没有盾牌的如图: 如果程序需要在C盘做些写入操作 就必须具有管理员权限 所以需要在工程中进行设置. 注:自己项目的安装程序安 ...
- qt 3 获取文件路径中的一部分
QList<QString> qlist = path.split(QRegExp("[\\\\/]")); QString FileName = qlist.at(q ...
- 判断浏览器是否为IE内核的最简单的方法
没啥说的,直接贴代码,算是ie hack了. if (!+[1,]) { alert('is ie'); }
- [HDOJ3714]Error Curves(三分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3714 题意:求n个二次函数在[0,1000]的最小值. 三分枚举. #include <bits ...
- ettercap
作者: 官网:http://ettercap.github.io/ettercap/ 源码:https://github.com/Ettercap/ettercap 功能:arp欺骗
- flex布局注意点:
1.父元素display:flex之后成为伸缩容器,子元素(除了position:absolute或fixed)无论是display:block或者display:inline,都成为了伸缩项目.2. ...
- MQ使用几个命令
一.MQ常见基本指令: MQ现在使用的比较常见,但是在测试过程中,使用命令行直接查询,有时候事半功倍. activemq-admin stop activemq-admin list activemq ...