iCoder

iOS开发 静态库.a/.framework合并及加载

2022-12-29  本文已影响0人  Leoeoo

一、合并.a

1、同一个静态库不同的架构合并

我们在开发过程中,可能会碰到把同一个静态库的不同架构进行合并。如:合并armv7架构和x86_64架构;
如下图

image.png
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.png
libtool -static -o FrameworkA *.o

此时FrameworkA.framework中就包含FrameworkB.framework中的内容了。

三、加载静态库.a/.framework

一、加载.a

image.png

方式一

通过addFiles添加

image.png
此时Xcode会自动在Library Search Path中添加libLibA.a的路径。
image.png
Header Search Paths不需要设置的原因是已经把 LibA.h添加到了项目中。如果不把 LibA.h添加到项目中,此时需要指定Header Search Paths路径。

方式二

此方式不需要在Xcode中显式显式.a

1、指定Library Search PathlibLibA.a的路径。
2、指定Header Search PathsLibA.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 的路径。

image.png

方式二

指定Framework Search PathsFrameworkA.framework的路径。
注意:只有静态库这种方式有效。

上一篇下一篇

猜你喜欢

热点阅读