iOS 几个命令轻松搞定三方库冲突

一. 准备工作

  1. 库文件: 链接: https://pan.baidu.com/s/1kUTTDcF 密码: kahe

  2. 工具: 命令行

  3. 下载库文件 WYShenQiMid.framework 保存并解压到桌面。

二. WYShenQiMid.framework/WYShenQiMid 静态库文件里面有什么

  1. Unix 的静态链接库没什么神秘的,它就是个压缩包,和平时比较常见的 zip 或 rar 之类的压缩包一样,只不过人家是用一个叫 ar 的压缩工具压缩的而已。所以我们给它解压缩一下,看看它里面都有什么。既然是用 ar 压缩的,解压自然也要用 ar 这个工具。

  ar -x 会解压在文件夹显示 [如果不出错也要 cd 到库文件目录中才能真正解压出文件,而不是全路径,见文末]

  ar -t 在命令行输出库文件内容

1 Weep-Yan:~ WeepYan$ ar -x /Users/WeepYan/Desktop/WYShenQiMid.framework/WYShenQiMid 
2 ar: /Users/WeepYan/Desktop/WYShenQiMid.framework/WYShenQiMid is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
3 ar: /Users/WeepYan/Desktop/WYShenQiMid.framework/WYShenQiMid: Inappropriate file type or format

  这里先解释一下它为什么这么 (fat)。在做 iOS 开发时我们都知道可以用模拟器和真机来测试我们的项目,但是这两个平台的架构是不一样的,模拟器是 i386 x86_64 架构的,而我们的设备是 armv7 arm64 架构的。当在制作静态链接库的时候也要针对不同的架构制作出针对真机和模拟器的两个静态链接库,而当我们想在自己的项目中使用静态链接库的时候,如果在模拟器上运行我们要用针对模拟器的静态库版本,用真机设备测试的时候还要切换到针对真机的静态链接库,这样一来非常的麻烦。前面说过了静态链接库就是个压缩包,那么我们是否能将这两个静态链接库压缩成一个静态链接库这样就可以同时支持模拟器和真机设备两种架构了呢?答案是肯定的。[附:如何查看和合并库信息]

  2. 查看库文件的架构,确实很 (fat)。

1 Weep-Yan:~ WeepYan$ lipo -info /Users/WeepYan/Desktop/WYShenQiMid.framework/WYShenQiMid 
2 Architectures in the fat file: /Users/WeepYan/Desktop/WYShenQiMid.framework/WYShenQiMid are: armv7 i386 x86_64 arm64 

  3. 既然很 (fat),那我们就要先给它瘦身才能解压,随便从里面抽出一个架构的静态链接库来。

1 Weep-Yan:~ WeepYan$ lipo -thin i386 /Users/WeepYan/Desktop/WYShenQiMid.framework/WYShenQiMid -output /Users/WeepYan/Desktop/WYShenQiMid

  4. 执行后在桌面会有一个文件生成,查看架构确实瘦身了。

1 Weep-Yan:~ WeepYan$ lipo -info /Users/WeepYan/Desktop/WYShenQiMid
2 input file /Users/WeepYan/Desktop/WYShenQiMid is not a fat file
3 Non-fat file: /Users/WeepYan/Desktop/WYShenQiMid is architecture: i386

  5. 现在我们再用 ar 命令解压它看看里面有什么?(用 ar -t 仅查看不解压)

1 Weep-Yan:~ WeepYan$ ar -t /Users/WeepYan/Desktop/WYShenQiMid
2 __.SYMDEF SORTED
3 WYCommonUtil.o
4 WYAppUtil.o
5 WYKeyChain.o
6 WYShenQiMid_vers.o
7 Weep-Yan:~ WeepYan$ 

  解压完成后你会看到好多好多以.o结尾的对象文件,这些对象文件就是给链接器最终生成静态链接库时用到的文件。

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

  1. 使用 lipo 分别将.a拆分(3. 瘦身);

  2. 使用 ar 命令删除其中一个 .a 的冲突的 .o;

  3. 使用 lipo 合并;[附:如何查看和合并库信息]

 1 Weep-Yan:~ WeepYan$ ar -t /Users/WeepYan/Desktop/WYShenQiMid
 2 __.SYMDEF SORTED
 3 WYCommonUtil.o
 4 WYAppUtil.o
 5 WYKeyChain.o
 6 WYShenQiMid_vers.o
 7 Weep-Yan:~ WeepYan$ 
 8 Weep-Yan:~ WeepYan$ ar -d WYShenQiMid WYAppUtil.o
 9 ar: WYShenQiMid: No such file or directory
10 Weep-Yan:~ WeepYan$ ar -d /Users/WeepYan/Desktop/WYShenQiMid WYAppUtil.o
11 Weep-Yan:~ WeepYan$ ar -t /Users/WeepYan/Desktop/WYShenQiMid
12 __.SYMDEF SORTED
13 WYCommonUtil.o
14 WYKeyChain.o
15 WYShenQiMid_vers.o
16 Weep-Yan:~ WeepYan$

  这样就删除了 .o 文件,对不同架构的库重复操作,然后再合并就好了!

  注意:如果查看是使用 ar -x 查看的一定要 cd 到目录才能解压查看。

1 Weep-Yan:~ WeepYan$ ar -x /Users/WeepYan/Desktop/WYShenQiMid 
2 Weep-Yan:~ WeepYan$ cd /Users/WeepYan/Desktop/
3 Weep-Yan:Desktop WeepYan$ ar -x WYShenQiMid 
4 Weep-Yan:Desktop WeepYan$

  这样在桌面就能看到那些 .o 文件了。

  合并.o命令: libtool -static -o ./NewName *.o

  ar rc NewName.a *.o

  

时常一个人发呆,看到宁静的天空。
原文地址:https://www.cnblogs.com/pinweyshg/p/7285184.html