某些无良SDK厂商, 会把他们用到的第三方库打到自己的静态库里面, 如果我们项目中也用到了这个库, 就会造成冲突编译失败.

定位

根据编译报错提示, 查看冲突的库是位于哪个文件中, 这边查看是 libcoreSupport.a 文件里面的 ZipArchive.o 库冲突

查看静态库包含的架构

一般静态库都是'胖(fat)'库, 里面包含多个架构, 这个命令一般会输出 "xxx.a are: armv7 arm64" 之类的, 具体根据你的 .a 文件实际包含情况而定

lipo -info ./libcoreSupport.a

按架构分解 .a 库

如果要查看或者删除 .a 文件 包含的 .o 库, 需要 .a 是 NOFat 的, 所以我们要把它们都拆出来

lipo -thin arm64 ./libcoreSupport.a -output ./arm64.a
lipo -thin armv7 ./libcoreSupport.a -output ./armv7.a

查看 .a 文件 包含的 .o 库

查看包括了哪些库, 一般是输出一堆 xxx.o 的列表

ar -v -t ./arm64.a

删除 .a 文件 包含的 .o 库

当库冲突的时候, 可以根据实际情况, 直接删除.a中对应架构的.o文件, 每个架构都要删去

ar -v -d arm64.a ZipArchive.o
ar -v -d armv7.a ZipArchive.o

最后合并所有架构, 生成一个新的.a胖包

把你拆出来的各个架构都合并起来

lipo -create ./arm64.a ./armv7.a -output ./libcoreSupport.a

完结撒花🎉

把新 .a 替换项目中原来的 .a文件, 再编译试试吧