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

在开发期间集成ZBar 和 支付 的时候,发现很多提示是.o文件冲突,最常见的时base64冲突,原因是由于不少第三方静态库中都有base64这个文件

在网上查了许久,发现都是转载的同一篇文章,由于对console命令不熟悉,也花费了一番功夫,请教了高手,,终于还是搞定了

下面附上方法,

打开console终端,找到要解剖的.a文件(可以先拷贝一份,我是拷贝一份放到桌面了),执行下列命令查看库包含的cpu架构代码:

xcrun -sdk iphoneos lipo -info libx.a

Architectures in the fat file: libx.a are: i386 armv7 armv7s //此处如果直接使用lipo命令看到的会是: i386 armv7 (cputype(12)subcputyp(11))

/Users/HELLO/Desktop/libcrypto.a 是文件路径

bogon:~ HELLO$ lipo -info /Users/HELLO/Desktop/libcrypto.a

Architectures in the fat file: /Users/HELLO/Desktop/libcrypto.a are: armv7 armv7s i386 x86_64 arm64

然后用

xcrun -sdk iphoneos lipo -extract_family i386 -output libx-i386.a libx.a

xcrun -sdk iphoneos lipo -extract_family armv7 -output libx-inter.a libx.a

bogon:~ HELLO$  lipo -extract_family i386 -output /Users/HELLO/Desktop/libcrypto-i386.a /Users/HELLO/Desktop/libcrypto.a

bogon:~ HELLO$  lipo -extract_family armv7 -output /Users/HELLO/Desktop/libcrypto-inter.a /Users/HELLO/Desktop/libcrypto.a

分离出arm版本的.a,这里有个小问题,按我的理解此命令应该对包含3种cpu代码的.a里的armv6部分进行操作,而实际分离出来的.a却是同时包 含armv7和armv7s的部分,也就是依然是”fat” lib,这样是不能抽出.o的,因此还需要进行以下操作:

lipo libx-inter.a -thin armv7 -output libx-armv7.a

lipo libx-inter.a -thin armv7s -output libx-armv7s.a

bogon:~ HELLO$ lipo /Users/HELLO/Desktop/libcrypto-inter.a -thin armv7 -output /Users/HELLO/Desktop/libcrypto-armv7.a

bogon:~ HELLO$ lipo /Users/HELLO/Desktop/libcrypto-inter.a -thin armv7s -output /Users/HELLO/Desktop/libcrypto-armv7s.a

这样就能分离出2份不同版本arm的.a了,然后进行解.o操作:

ar -x libx-armv7.a

这部操作最好放到单独的文件夹里进行

(/Users/HELLO/Desktop/armv7/)桌面上的文件armv7文件夹路径

在文件夹里面进行操作本步骤

bogon:home HELLO$ cd /Users/HELLO/Desktop/armv7/

bogon:armv7 HELLO$ ar -x /Users/HELLO/Desktop/armv7/libcrypto-armv7.a

,会将link出.a的所有.o还原出来,然后有两种选择:一是把所有库对应cpu架构的部分都还原到这个位置,然后 将重复的部分合并为一份,接着用后面的命令将所有.o再合并为一份公共lib。还有一种选择就是保留重复符号中的一份lib完好如初,将其余lib单独解 开,剔出重复符号存在的.o,然后将该lib重新link回.a,以去除重复符号。

不管用哪种方法解决,最后的link回命令如下:

libtool -static -o ../libx-armv7.a *.o

bogon:armv7 HELLO$ libtool -static -o ../libcrypto-armv7.a *.o【.a 和 * 号之间有一个空格】

仍然在armv7文件夹里操作,会在armv7的上一级文件中重新生成.a文件(由于我的上一级目录是桌面所以直接覆盖了原先桌面的文件)

【我查了下这个”has no symbols”好像只是提示性质,不是错误提示】

当然,别忘了咱们的库都是有多份cpu架构指令的,所以,先要对每种cpu arch的库进行同样操作,然后还要将thin lib合并回fat lib:

lipo -create -output libx.a libx-armv7.a libx-i386.a libx-armv7s.a

最后合并成一个.a文件替换工程里的.a文件就行了

这样,再link回自己的app时就不会再出现duplicate symbol了。

时间: 2024-09-30 00:27:54

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

静态库介绍与简单演练及同名资源冲突解决

1.静态库和动态库都是闭源库,不公开源代码. 静态库:.a和.framework 动态库:.dylib和.framework(iOS9取消了.dylib,使用.tbd替代) 2.静态库和动态库在使用上的区别: 静态库:链接时,静态库中使用的文件会被完整的复制到可执行文件中,被多次使用就有多次冗余拷贝 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存 注意:项目中如果使用了自制的动态库,不能被上传到AppStore. 因为:动态库存在于系统中

Xcode svn import项目 上传.a文件(静态库)

在终端使用命令 touch 项目所在文件夹 svn import 项目文件夹 https://服务器地址 -m "iPad import" 这样就把项目上传到服务器上了!但是不能把.a文件上传到服务器. 上传.a文件(静态库),首先进入.a文件所在的文件夹,使用命令 svn add 文件名.a 然后在使用命令 svn commit -m “提交说明消息” http://blog.csdn.net/wohaoxuexi/article/details/8444184

Linux编译多个不同目录下的文件以及静态库、动态库的使用

先看两篇博文,作为基础知识.如果对C/C++编译链接过程都了解的话,可以跳过不看. http://www.firedragonpzy.com.cn/index.php/archives/2556 http://www.cppblog.com/shifan3/archive/2007/01/05/17325.html 一.  编译不同目录下的多个文件 各个文件的布局如下: head.h文件的代码: [cpp] view plaincopy #ifndef  HEAD_H #define  HEAD

.h头文件、 .lib库文件、 .dll动态链接库文件之间的关系(转)

h头文件作用:声明函数接口 dll动态链接库作用:含有函数的可执行代码 lib库有两种: (1)静态链接库(Static Libary,以下简称“静态库”) (2)动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”) 两者的区别: 实质是不一样的东西. 静态库本身就包含了实际执行代码.符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息. 如:当我们在自己的程序中引用了一个h头

glibc库详解及与POSIX,system V这些库之间关系的说明

自己想了解下关于system v,在网上看到一篇详细的说明,与大家分享一下,原文地址http://hi.baidu.com/tekuba/item/570887775696542e5c178918 以前对glibc,POSIX等的关系一直很迷惑.这是今天在网上找到的说明glibc,POSIX,system V关系的一篇不错的文章,虽然有些地方不通顺(大概是直接用机器翻译过来的),但大概意思能明白了.通过下面的说明,我们就可以明白linux应用层的层次构造.关键是glibc,他是linux最底层的

pbxproj文件冲突解决办法

企业开发经常会遇到project.pbxproj文件冲突的问题 project.pbxproj文件主要包含了以下几项主要信息 工程文件关联信息,如PBXBuildFile.PBXFileReference 组织结构分类信息,如PBXGroup 项目工程配置信息,如XCBuildConfiguration.XCConfigurationList 如果两个人同时在某一个版本节点上做了修改,例如增删文件等行为,那么保存/提交就会出现冲突,如果是svn就会强制在文件中给你加上>>>>>

iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但是用起来也是很方便的.iOS开发用到的输入输出流和在Java中的输入输出流是几乎一样的,本质也是一个意思:将网络返回的数据当做流来处理.    输入输出的理解:输入到哪里?输出到哪里?这个问题不难理解,输入输出是要站着服务器角度来思考的,下面用图来解释:    代码关键词: 1.在接收到响应头的代理

过滤器为JSP文件生成静态页面

用过滤器为JSP文件生成静态页面,这只是一个简单的实例,客户端浏览器第一次请求JSP页面时,服务器将生成对应的HTML文件,以后访问同一JSP文件,将转为访问生成的HTML文件.一.过滤器 package com.kenfor.lyb.toHtmlfilter; import java.io.*; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.s

android google 统计导致的文件冲突

android studio 加入google 统计 1. buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath 'com.google.gms:google-services:3.0.0' // NOTE