网上流传了太多关于合并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 the fat file: 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 |
相关推荐
验证方法是自己做个静态库 ,打一个MBProgressHUD进去 然后在项目中引入这个静态库,尝试在项目中引入MBProgressHUD 造成duplicate symbol 错误,然后运行脚本 裁剪库后修改库名 再次运行,项目能跑通 代表裁剪成功...
com.amap.api.maps.model.animation 动画类,可用于支持动画的覆盖物。 com.amap.api.maps.model.particle 粒子效果类,用于添加粒子效果覆盖物。 com.amap.api.maps.offlinemap 离线地图包,用户可以通过手机...
- 选择器在运行时也是可用的,可以用于方法调用。 - 使用objc_copyProtocolList来复制一个类遵循的所有协议。 6. 关联引用(Associative References) - 可以使用关联引用将额外的信息与对象实例关联起来,使用...
【使用RMAN DUPLICATE...FROM ACTIVE DATABASE 创建物理备库】 在Oracle数据库管理中,创建物理备用数据库(Physical Standby Database)是数据保护策略的重要组成部分,主要用于实现Data Guard环境中的灾难恢复和...
《重复文件清理助手:Duplicate Cleaner深度解析》 在日常的计算机使用中,文件的积累往往会带来一个问题——重复文件。这些冗余的文件不仅占用了宝贵的硬盘空间,还可能造成文件管理的混乱。为此,我们引入了一款...
综上所述,Duplicate Cleaner Pro 3.2.5是一款不可或缺的硬盘管理工具,无论对于个人用户还是企业用户,都能有效地提升硬盘空间利用率,简化文件管理,使电脑保持高效运行状态。只需简单几步,就能让杂乱无章的硬盘...
### Altium Designer中“Duplicate Net Names Wire”错误的终极解决办法 #### 一、问题概述 在使用Altium Designer进行电路设计过程中,遇到“Duplicate Net Names Wire”这一类错误是较为常见的现象。这类错误通常...
总结来说,`react_gradle`是一个用于解决React Native项目中`duplicate_file`错误的自定义Gradle脚本。通过覆盖默认的`react.gradle`,我们可以根据项目需求定制处理策略,例如重命名、忽略或合并冲突文件。结合...
然而,在真实场景下,这些注册码应该是由软件开发商提供的唯一且合法的密钥,用于激活特定版本的Duplicate File Cleaner软件。 ### 使用注册码激活软件 1. **获取官方注册码**:首先,用户应通过正规渠道购买软件...
Duplicate Picture Finder 1.0.5.10汉化版正是为了解决这个问题而设计的,它是一款专用于查找并管理重复图片的工具。 这款软件的核心功能是查找完全相同的图片以及相似的图片。它采用了先进的图像比对算法,能够在...
Duplicate Cleaner 支持常规 / 图片 / 视频 / 音频四种搜索模式,可设置文件名称、大小、日期、相似内容、相同内容等过滤条件查找文件、图片、音视频等重复文件,清理重复文件快速彻底。 媒体文件预览 内置简易...
Oracle 11gR2 使用 RMAN duplicate from active database 复制数据库 Oracle 11gR2 中使用 RMAN duplicate from active database 复制数据库是一种高效的数据库复制方法。这种方法可以直接从活动数据库复制,省去...
Duilib 是一个基于C++的开源图形用户界面(GUI)开发库,专为快速构建Windows桌面应用程序而设计。它的名称“Duilib”是“DUI Library”的缩写,其中“DUI”代表“Desktop User Interface”。这个库提供了一系列丰富...
Duplicate Entry(亲测可用).md
10.B 11.B 12.C 13.A 14.D 15.D 16.A 17.A 18.D 19.B 20.A 21.C 22.A 23.C 24.C 25.C 26.D 27.C 28.C 29.D 30.C 31.B 32.A 33.ABCD 34.ACD 35.CD 36.ABCD 37.AB 38.ABCD 39.AC 40.ABCD 41.ABCD 42.ABD 43.AD 44....
### Oracle DataGuard 环境搭建详解:使用Duplicate方法 #### 一、Oracle DataGuard简介与应用场景 Oracle DataGuard是一种高可用性和灾难恢复解决方案,它能够保护数据免受逻辑和物理故障的影响。DataGuard通过...
javax.ejb.DuplicateKeyException.class javax.ejb.EJB.class javax.ejb.EJBAccessException.class javax.ejb.EJBContext.class javax.ejb.EJBException.class javax.ejb.EJBHome.class javax.ejb.EJBLocalHome....
MySQL 中处理重复数据(Duplicate)的方法 MySQL 中处理重复数据(Duplicate)的主要方式是使用 INSERT INTO ... ON DUPLICATE KEY UPDATE 语句或 REPLACE INTO 语句。下面是这两种方法的详细解释: 一、INSERT ...
5. **动态链接库 (Interop.IWshRuntimeLibrary.dll, TSS Foundation Libraries.dll)**:这些都是DLL文件,它们包含可重用的代码模块,供主程序(Duplicate File Finder Plus.exe)调用。`Interop.IWshRuntimeLibrary....