前言
今天引入一个“个推”的库,结果悲剧的发现,zip.o 、unzip.o、mztools.o和 mztools.o文件冲突,导致编译失败。
后来在网上查了查解决办法。
- 删除项目中重复的类,换一个别的实现(不太现实)
- 对冲突的文件重命名
- 删除.a中,冲突的文件
前两种不做解释,主要针对第三种方法详解。
解决步骤
先拷贝项目中的.a文件出来。(不要问我.a文件在什么位置)
第一步:查看报信息
lipo -info libx.a
例如 输出结果:
Architectures in the fat file: libGeTuiSdk-1.4.3-noidfa.a are: armv7 i386 x86_64 arm64
如果提示fat file,那么代表这个包是支持多平台的,例如armv7,armv7s,i386等,这需要我们逐一做解包重打包操作。
第二步:创建文件夹
由于到合并多个包,所以需要先分好类后,再进行此操作
mkdir armv7
第三步:提取armv7平台的包
在第一步中,可以看到支持的各个平台。
lipo libx.a -thin libGeTuiSdk-1.4.3-noidfa.a -output armv7/libgt-armv7.a
第四步:解压.a文件
可以使用命令先进行查看.a包中的文件列表
ar -t armv7/libgt-armv7.a
解压.a包(内部都是.o文件)
cd armv7
ar xv libgt-armv7.a
第五步:删除冲突文件
针对minizip来说,我在个推包中,删除如下几个文件
rm zip.o
rm unzip.o
rm mztools.o
rm mztools.o
第六步:重新打包
删除后,重新把.o文件,打成.a包。
cd ..
ar rcs libgt-armv7.a armv7/*.o
第七步:根据支持平台类型,重复以上的操作,直到全部平台都操作一遍。
第八步:合并.a包,并替换文件
合并的新包,替换之前项目中的.a包
lipo -create libgt-armv7.a libgt-arm64.a libgt-i386.a libgt-x86_64.a -output libGeTuiSdk-1.4.3-noidfa-nominizip.a
步骤总结
- 查看
architectureslipo -info libx.a
- 如果是fat file,处理成non-fat
lipo libx.a -thin armv7 -output libx-armv7.a - 解压出object file
ar xv libx-armv7.a - 打包object file
ar rcs libx.a *.o - 生成Fat file
lipo -create Libarmv7.a -output libx.a - 合并.a文件
lipo -create Libarmv6.a Libarmv7.a -output Lib.a
网友评论