iOS开发 静态库.a/.framework合并及加载
2022-12-29 本文已影响0人
Leoeoo
一、合并.a
1、同一个静态库不同的架构合并
我们在开发过程中,可能会碰到把同一个静态库的不同架构进行合并。如:合并armv7
架构和x86_64
架构;
如下图
libB
文件夹下为arm64
架构的libLibB.a
image.png
libB-x86
文件夹下为x86-64
架构的libLibB.a
image.png
合并两个.a:
lipo -create ~/Desktop/111/libB/libLibB.a ~/Desktop/111/libB-x86/libLibB.a -output ~/Desktop/111/libB/libLibB.a
lipo命令使用:https://www.jianshu.com/p/ad4bd1711c62
2、不同的静态库合并
当静态库LibA.a
里面使用到了静态库LibB.a
,但是我们只想把LibA.a
对外提供时,可以把LibB.a
合并到LibA.a
里面。
1、解析libLibB.a
中.o
文件
ar -x libLibB.a
image.png
2、解析libLibA.a
中.o
文件
ar -x libLibA.a
image.png
3、把LibB.o
复制到libA/
文件夹下并合并
image.png
libtool -static -o libLibA.a *o
此时,libLibA.a
中已经包含了libLibB.a
中的LibB.o
。
4、对外提供libLibA.a即可
5、针对两个库包含相同的.o
,可以ar -x
解析出.o
文件,然后删除掉其中一个库中的重复.o
文件,再通过libtool
合并.o
即可。
二、合并.framework
1、通过ar -x
提取.o
ar -x FrameworkA
ar -x FrameworkB
image.png
image.png
2、复制到A并合并
image.pnglibtool -static -o FrameworkA *.o
此时FrameworkA.framework
中就包含FrameworkB.framework
中的内容了。
三、加载静态库.a/.framework
一、加载.a
image.png
方式一
通过addFiles
添加
此时Xcode会自动在
Library Search Path
中添加libLibA.a
的路径。image.png
Header Search Paths
不需要设置的原因是已经把 LibA.h
添加到了项目中。如果不把 LibA.h
添加到项目中,此时需要指定Header Search Paths
路径。
方式二
此方式不需要在Xcode中显式显式.a
。
1、指定Library Search Path
中libLibA.a
的路径。
2、指定Header Search Paths
中LibA.h
的路径。
3、指定Other Linker Flags
中加载libLibA.a
image.png
该指令表示加载:
libLibA.a
:加载时会自动在
LibA
前面加上lib
前缀,在LibA
后面加上.a
后缀
-l"LibA"
image.png
更多指令见:
man ld
此时就可以在代码里面正常调用该库了。
二、加载.framework
方式一
通过addFiles
添加
此时Xcode会自动在 Library Search Path
中添加 libLibA.a
的路径。
方式二
指定Framework Search Paths
中FrameworkA.framework
的路径。
注意:只有静态库这种方式有效。