网上流传了太多关于合并lib库的方法,自己也尝试过,但大多失败。有感于这种急于解决问题,经过百般尝试后依旧无果的无奈心情,小翁在这里用一个实例来完整阐述如何在mac中合并lib静态库。

这里以移动广告平台多盟的三个lib库为例子,之所以以此为例子,是因为我也遇到了库冲突的问题,所以才有了本文的内容。

本文的目标:合并libDomobOfferWallSDK.a、libDomobAdWallCoreSDK+UI.a、libDomobAdSDK.a

Let`s begin!

1.依次查看所有需要合并的lib库所支持的框架类型。i386表示支持iphone模拟器,armv6应用在iphone 3gs上,armv7应用在iphone4,armv7s应用在iphone4s以及iphone5,arm64应用在最新的iphone5s上。

1
lipo -info libDomobOfferWallSDK.a<br><br>输出是:Architectures in <span style="color: #ff0000;"><strong>the fat file:</strong></span> libDomobOfferWallSDK.a are: armv7 armv7s i386
1
其他同理

看到红色粗体的fat了吗,fat file表示这个库里面合并了多于1个框架。

2.将lib库拆分出armv7、armv7s、i386类型的.a:

1
lipo -extract_family armv7 -output libDomobOfferWallSDK_arm.a libDomobOfferWallSDK.a

很多人会以为上面这条命令就可以一步到位分离出armv7版本,因为你显式地指出armv7了。但是,你错了。 libDomobOfferWallSDK_arm.a仍旧是fat file,也就是里面含有了arm所有版本,这也是网上很多版本的教程错误的原因。如果误以为libDomobOfferWallSDK_arm.a只含 armv7一个版本,则下一步的解.o操作就会失败,会提示"is a fat file"。小翁认为,最保险的做法是每次lib变化时都用lipo -info查看一下。现在我们查看一下libDomobOfferWallSDK_arm.a库:

1
2
lipo -info libDomobOfferWallSDK_arm.a
打印出:Architectures in the fat file: libDomobOfferWallSDK_arm.a are: armv7 armv7s

接着用如下命令进一步分离出单独的armv7、armv7s版本:(非常重要的步骤)

1
lipo libDomobOfferWallSDK_arm.a -thin armv7 -output libDomobOfferWallSDK_armv7_final.a
1
lipo libDomobOfferWallSDK_arm.a -thin armv7s -output libDomobOfferWallSDK_armv7s_final.a

而对于i386则不用上述那么麻烦,直接用第一句-extract_family指令就能分离出只含i386版本的库:

1
lipo -extract_family i386 -output libDomobOfferWallSDK_i386.a libDomobOfferWallSDK.a

经过上面操作后,我们得到了第一个待合并库libDomobOfferWallSDK.a 的armv7、armv7s、i386三个版本的库。剩下的两个待合并库同理。

3.分离出目标文件(.o)

进行实质上的合并。xcode里提示duplicate symbol都是说***.o与***.o冲突。注意,只有非fat file,也就是只含有单种版本的lib库才能分离出.o文件

1
2
3
ar -x ../libDomobOfferWallSDK_armv7_final.a
ar -x ../libDomobAdWallCoreSDK+UI_armv7_final.a
ar -x ../libDomobAdSDK_armv7_final.a

这一步最好是在lib*_final.a的同级目录下新建一个文件夹,专门用来接收解压出来的.o文件。同种版本(如armv7)的都解压到这个文件夹中,相同的.o文件他会自己覆盖掉。

4.从.o文件中合并成静态库:

1
libtool -static -o ../libDomobUniversal-armv7.a *.o

armv7s、i386版本同理。

5.合并成最终的通用静态库:

1
lipo -create -output libDomobUniversal.a libDomobUniversal-i386.a libDomobUniversal-armv7.a libDomobUniversal-armv7s.a

  

【原】IOS合并lib(.a)库的终极可用方法(可用于解决duplicate symbol静态库冲突)的更多相关文章

  1. Xcode6.1标准Framework静态库制作方法。工程转Framework,静态库加xib和图片。完美解决方案。

    http://www.cocoachina.com/bbs/read.php?tid-282490.html Xcode6.1标准Framework静态库制作方法.工程转Framework,静态库加x ...

  2. iOS解决两个静态库的冲突 duplicate symbol

    http://blog.163.com/023_dns/blog/static/118727366201391544630380/ 场景: 解决TencentOpenAPI.framework与Zba ...

  3. 解决引用openssl静态库libcrypto.a和libssl.a出现undefined reference to错误的问题

    最近在做使用openssl链接http和https的项目,编译时出现以下问题. /usr/local/openssl/lib/libcrypto.a(async.o): In function `as ...

  4. 编译iOS程序时的-all_load选项,以及-all_load 导致的 ld duplicate symbol xx的问题

    在新的SDK环境中调试百度地图的应用程序时,app总是意外退出,找了半天发现错误的原因是unrecognized selector xx的错误,另外还有报了一个Unknown class XXX in ...

  5. 动态库dll使用module.def文件导出函数(像静态库一样使用)

    1.新建文件module.def. 2.动态库工程上右键->属性->链接器->输入->模块定义文件编辑它写入module.def 3.下面为module.def实例(smart ...

  6. 属性.native用于解决第三方el组件库@click事件无效

    描述 有时发现用一些第三方的组件库时,例如一个封装好的button按钮<el-butten>,绑定点击事件却没有任何作用,这时便需要加 .native 原因: v-on 是对 Vue 的事 ...

  7. Xcode下开发c静态库for ios CPU架构 静态库合并

    新建一个Cocoa Touch Static  Library工程 1,先在工程左侧删除“工程名Tests”下的文件与文件夹(从内往外删,最后删除"工程名Tests文件夹") :D ...

  8. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  9. iOS静态库及Framework 创建

    本文转自cocoachina,尊重作者的汗水. 讲述的非常透彻,有需要的朋友可以阅读实践.转载请注明出处 //=================以下留着备份==================// 在 ...

随机推荐

  1. js公用方法

                   }                              {                      {                          }    ...

  2. jquery.ajax

    var params = {};//定义一个数组 var USERNAME= $("#USERNAME").val(); params["USERNAME"]= ...

  3. Mac读取Andriod屏幕截图

    int main(int argc, const char * argv[]) { // insert code here... string str3 = "/Users/Ethan/Do ...

  4. 关于object和embed

    最近发现很久之前写的demo 在FF上有兼容问题, 主要发生在如下: 由于时间太久,自己都有点搞不清怎么写的,尤其是object标签,今天查了很多资料,总结一下object标签 在网页中正常显示fla ...

  5. Android安全开发之浅谈密钥硬编码

    Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...

  6. CI-持续集成(1)-软件工业“流水线”概述

    CI-持续集成(1)-软件工业“流水线”概述 1   概述 持续集成(Continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次, ...

  7. MySQL mysqldump数据导出详解

    介绍 在日常维护工作当中经常会需要对数据进行导出操作,而mysqldump是导出数据过程中使用非常频繁的一个工具:它自带的功能参数非常多,文章中会列举出一些常用的操作,在文章末尾会将所有的参数详细说明 ...

  8. 使用PM2将Node.js的集群变得更加容易

    介绍 众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎.不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心 ...

  9. C语言 · 删除数组0元素

    从键盘读入n个整数放入数组中,编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动.注意,CompactIntegers函数需要接受数组及其元素个数作为参数,函数 ...

  10. Apache-Tomcat的安装配置

    现在将使用Tomcat的一些经验和心得写到这里,作为记录和备忘.如果有朋友看到,也请不吝赐教. 1.首先是Tomcat的获取和安装. 获取当然得上Apache的官方网站下载,开源免费,而且带宽也足够. ...