合并静态库以及iOS静态库.a文件转.m文件


静态库基本知识

Cocoa平台下 有 framework 和 .a 类型,接下来我们主要分析.a类型的静态库

静态库根据包含的架构类型可以分fat和thin,一般有armv7、armv7s、arm64、arm64e等类型。

fat  包含多个架构

thin 包含单个架构
1、查看静态库架构信息
lipo -info xxx.a

2、如果是多架构类型,分离静态库架构

lipo -extract_family armv7 -output xxx.a xxxSDK.a
warmming:小心这样写是导致错误发生,这种写法针对fat文件是无法成功的。

如果出现以下信息,说明是包含多个架构的静态库,需要分离

Architectures in the fat file:  xxx.a are: armv7 armv7s

下一步:分离.a 包含的多架构

lipo xxx.a -thin armv7 -output xxx_armv7.a
lipo xxx.a -thin armv7s -output xxx_armv7s.a

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

lipo -extract_family i386 -output xxx_i386.a xxx_i386.a

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

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

ar -x ../xxx_armv7.a
ar -x ../xxx_armv7s.a
ar -x ../xxx_i386.a

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

4.从.o文件中合并成静态库
libtool -static -o ../xxx_armv7.a  *.o

5.合并成最终的通用静态库
lipo -create -output test1.a test2-i386.a test3-armv7.a test4-armv7s.a


从.a静态库文件导出.m 文件

准备一个静态库.a文件,比如我们之前制作的 xxx.a,放在桌面的test目录里。

1、打开终端:

2、cd 到 libVideoPlayerLib.a 所在的文件夹test下

cd ~/Desktop/test/

3、查看 libVideoPlayerLib.a 包含几种架构 arch 。 (file 命令)

file xxx.a

lipo -info xxx.a

4、分离出一种架构的.a。(lipo **.a -thin armv7 -output armv7.a)

lipo xxx.a -thin armv7 -output xxx_armv7.a

5、抽离.a文件的object文件.o。(ar -x armv7.a)

ar -x xxx_armv7.a

6、将.o 转换为 .m。(nm ****.o > ****.m)

nm xxx.o > xxx.m

到这里关于静态库.a 相关的知识就结束了,如果有遇到新的问题,下面再做补充!

你可能感兴趣的:(合并静态库以及iOS静态库.a文件转.m文件)