关于 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文件的更多相关文章

  1. iOS - 静态库的导入和头文件路径的设置

    开发过程中,免不了要用到一些第三方或者是别人写好的一些Demo,这时就经常会用到别人写的一些静态库(.a文件)和n多个头文件(.h文件),这些文件不是简单地把它们拉到自己的工程里面就行的,还要设置一些 ...

  2. iOS 静态库,动态库与 Framework 浅析

    静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人 ...

  3. iOS静态库.a总结(2017.1.24增加脚本打包方法)

    修改于:2017.1.24 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.根据源代码的公开情况,库可以分为2种类型 a.开源库 公开源代码,能看到具体实现 ,比如SDWebImag ...

  4. iOS静态库相关-封装lib

    来源:http://blog.csdn.net/zsomsom/article/details/9163635 Library介绍 基本知识 在实际的编程过程中,通常会把一些公用函数制成函数库,供其它 ...

  5. iOS 静态库,动态库与 Framework

    iOS 静态库,动态库与 Framework     静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢 ...

  6. iOS - 静态库的创建与使用

    在日常项目开发中,不论是为了两个公司项目上的业务交流还是为了减少项目的编译时间,有的时候我们会把项目中的私密内容打包成静态库,或者是把项目中变动较少一部分打包成静态库以便提高编译效率,那么下面我们就来 ...

  7. IOS静态库

    如何在Xcode中创建C++静态库 http://jingyan.baidu.com/article/03b2f78c111fca5ea237ae26.html iOS 如何创建和使用静态库 http ...

  8. iOS静态库小结--(yoowei)

    准备知识: 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.根据源代码的公开情况,库可以分为2种类型 a.开源库 公开源代码,能看到具体实现 ,比如SDWebImage.AFNetw ...

  9. iOS静态库.a文件制作和导入使用

    iOS静态库.a文件制作: 1.新建Cocoa Touch Static Library工程 新建工程 - 选择iOS-FrameWork&Libary,选择 Cocoa Touch Stat ...

随机推荐

  1. python中zip函数

    zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表.(在海豚实习时自己写了一个要用到zip的函数,那个例子非常代表性) 示例1 for i,j in zip(range(3) ...

  2. Android中的sharedUserId属性详解

    在Android里面每个app都有一个唯一的linux user ID,则这样权限就被设置成该应用程序的文件只对该用户可见,只对该应用程序自身可见,而我们可以使他们对其他的应用程序可见,这会使我们用到 ...

  3. jQuery常用技巧-使用的总结

    1.关于页面元素的引用 通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用do ...

  4. 2016年6月24日 星期五 --出埃及记 Exodus 14:21

    2016年6月24日 星期五 --出埃及记 Exodus 14:21 Then Moses stretched out his hand over the sea, and all that nigh ...

  5. 判断List、Map、Set是否为空及效率比较

      //如果object为null,则设置为defaultValue ObjectUtils.defaultIfNull(object, defaultValue); //判断集合是否为null Li ...

  6. Ubuntu Linux 下文件名乱码(无效的编码)的快速解决办法

    文件是在WIndows 下创建的,Windows 的文件名中文编码默认为GBK,而Linux中默认文件名编码为UTF8,由于编码不一致所以导致了文件名乱码的问题,解决这个问题需要对文件名进行转码.文件 ...

  7. CUBRID学习笔记 43 insert into

    cubrid的中sql查询语法insert into ------ 官方文档是英文的,看不明白可以参看ocracle的同类函数说明.很多都是一样的. INSERT INTO a_tbl1(id) VA ...

  8. Codeforces Round #378 (Div. 2) C. Epidemic in Monstropolis 模拟

    C. Epidemic in Monstropolis time limit per test 1 second memory limit per test 256 megabytes input s ...

  9. Python基础学习笔记(一)入门

    参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-chinese-encoding.html 3. http://w ...

  10. LTE Module User Documentation(翻译2)——配置LTE MAC 调度器

    LTE用户文档 (如有不当的地方,欢迎指正!) 5 配置 LTE MAC 调度器   这里有几种 LTE MAC 调度器用户可以选择.使用下面的代码定义调度器的类型: Ptr<LteHelper ...