使用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的库之后,工程编译通过,运行正常!

时间: 2024-11-05 20:36:44

使用ar命令删除iOS静态库重复编译的.o文件的相关文章

iOS开发——装逼技术精选&全面了解 iOS 静态库开发

全面了解 iOS 静态库开发 简介 在企业开发中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,不想被外界知道,所以会把核心代码打包成静态库,只暴露头文件给程序员使用(比如:友盟.百度地图等第三方的sdk) 静态库和动态库的存在形式 静态库:.a 和 .framework 动态库:.dylib 和 .framework 静态库和动态库的区别 静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统

封装ios静态库碰到的一些问题(二)

在静态库建立好了之后呢,于是应用程序就引用它,加上拷贝的h文件,但是引用之后Build之后提示很多sybmbol 重复 于是进行检查,确实由于是从其他工程修改过来的,很多基础库都引用了,删除之,最后就只剩下xxx.h,死活就是报重复符号,我看来看去都没有 不得其解,后面突然想不过,使用了下definition,发现跳转到了一个文件,里面全部被注释的文件,于是明了,原来偷懒,有的代码是拷贝的,于是h和m文件都在,但是里面内容被注释了,结果xcode不买账啊,直接删除掉,Ok,解决问题 封装ios静

iOS 静态库冲突 连个不同的.o 文件冲突 ,静态库分离

在开发期间集成ZBar 和 支付 的时候,发现很多提示是.o文件冲突,最常见的时base64冲突,原因是由于不少第三方静态库中都有base64这个文件 在网上查了许久,发现都是转载的同一篇文章,由于对console命令不熟悉,也花费了一番功夫,请教了高手,,终于还是搞定了 下面附上方法, 打开console终端,找到要解剖的.a文件(可以先拷贝一份,我是拷贝一份放到桌面了),执行下列命令查看库包含的cpu架构代码: xcrun -sdk iphoneos lipo -info libx.a Ar

ios静态库的使用

ios静态库的使用 2014-03-11 22:24 3906人阅读 评论(0) 收藏 举报 ios的静态库文件是*.a,如果需要使用它,我今天学的简单的方法,可通过,简单说说,如果有一个A手机项目,一个B的静态库项目,A想使用B.a,按以下的步骤: 1.在A项目里面拖进B项目.在B的product下面会看见红色的B.a,表示还没有编译通过(在工程设置里添加上你需要导出的.m文件). 2.选择好需要编译的对象,B下的某模拟器或者是B下的真机上进行编译(模拟器上生成的静态库和真机上生成的不能混用)

iOS开发>学无止境 - 全面了解 iOS 静态库开发

简介 在企业开发中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,不想被外界知道,所以会把核心代码打包成静态库,只暴露头文件给程序员使用(比如:友盟.百度地图等第三方的sdk) 静态库和动态库的存在形式 静态库:.a 和 .framework 动态库:.dylib 和 .framework 静态库和动态库的区别 静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省

iOS 静态库,动态库与 Framework

iOS 静态库,动态库与 Framework 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件.另外一种情况是,对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制了,编译的时候只需要 Link 一下,不会浪费编译时间. 上面提到库在使用的时候需要

IOS静态库

如何在Xcode中创建C++静态库 http://jingyan.baidu.com/article/03b2f78c111fca5ea237ae26.html iOS 如何创建和使用静态库 http://blog.ibireme.com/2013/09/18/create-ios-static-framework/ iOS开发--创建你自己的Framework http://www.cocoachina.com/ios/20150127/11022.html https://www.raywe

iOS 8:【转】封装iOS静态库注意事项

源地址:http://fann.im/blog/2014/01/12/ios-static-library/ 做一个 iOS 静态库需要注意的东西: namespace 冲突.静态库用了某第三方库,项目也用了同样的第三方库,在编译的时候就会有 duplicate symbol 错误,因为有两份同样的第三方库.解决办法就是把用到的第三方库加上自定义前缀,包括类名.delegate 协议.常量名,尤其需要注意 Category 的方法名要修改. 封装静态库的时候应尽量避免引入重量级第三方库,多自己进

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

iOS静态库.a文件制作: 1.新建Cocoa Touch Static Library工程 新建工程 - 选择iOS-FrameWork&Libary,选择 Cocoa Touch Static Library工程. 2.Xcode的参数设置 "Build Active Architecture Only" 设置为"NO" "IOS Deployment Target" 设置为 "IOS 7.0" ,表示支持IOS7