多个静态库文件冲突处理方案

错误: duplicate symbol '_XXX' in

报错文件.png

一: 问题的原因

最近项目需要用到百度的语音识别,我们项目也用到了 AMR的一个三方库,这个库和百度语音识别用的是相同的三方处理音频的库,并且百度没有经过自己的包装,类似重新命名之类的

二: 问题的分析和思路

既然百度这种三方是不可能给你处理的,那么只能是我们开发者自己去处理, 解决的思路就是删除库文件中报错的符号, 今天我遇到的 .a 文件的报错,所以这个方案也是 .a 文件的处理,我估计 framework 处理方法也是一样的,我这边不处理百度的sdk 我处理的是我们使用的 ARM 这个库文件

错误出在 libopencore-amrnb.a 处理这个库
使用的工具是: ~~ lipo ar ~~

三: 实践步骤

1, cd到这个xxx.a库文件所在的文件夹目录 查看静态库支持的 CPU 环境

cd目录.jpeg
lipo -info libopencore-amrnb.a

输出

Architectures in the fat file: libopencore-amrnb.a are: i386 x86_64 armv7 armv7s arm64 

就是说这个库支持 i386 x86_64 armv7 armv7s arm64 这几种架构, 我们需要解压分离出这些架构环境下的文件

2, 根据支持的文件分离出对应的 文件

lipo libopencore-amrnb.a -thin i386 -output i386.a 
lipo libopencore-amrnb.a -thin x86_64 -output x86_64.a
lipo libopencore-amrnb.a -thin armv7 -output armv7.a
lipo libopencore-amrnb.a -thin armv7s -output armv7s.a
lipo libopencore-amrnb.a -thin arm64 -output arm64.a

这个命令我不说了, 可以搜索 lipo 工具使用, 其中 i386.a x86_64.a armv7.a armv7s.a arm64.a 这个是我们的目前分离文件,后面我们需要对这些文件删除符号,并且合并处理

3,我们根据报错的文件可以清楚地看到重复的文件是以下几个

l_abs.o 
norm_s.o 
shr.o
mult_r.o
l_shr_r.o
l_deposit_l.o
extract_l.o
norm_l.o 
l_deposit_h.o 
extract_h.o 
l_negate.o 
negate.o 
sub.o 
log2.o

4, 我们删除上面的文件

ar d i386.a l_abs.o norm_s.o shr.o mult_r.o l_shr_r.o l_deposit_l.o extract_l.o norm_l.o l_deposit_h.o extract_h.o l_negate.o negate.o sub.o log2.o
ar d x86_64.a l_abs.o norm_s.o shr.o mult_r.o l_shr_r.o l_deposit_l.o extract_l.o norm_l.o l_deposit_h.o extract_h.o l_negate.o negate.o sub.o log2.o
ar d armv7.a l_abs.o norm_s.o shr.o mult_r.o l_shr_r.o l_deposit_l.o extract_l.o norm_l.o l_deposit_h.o extract_h.o l_negate.o negate.o sub.o log2.o
ar d armv7s.a l_abs.o norm_s.o shr.o mult_r.o l_shr_r.o l_deposit_l.o extract_l.o norm_l.o l_deposit_h.o extract_h.o l_negate.o negate.o sub.o log2.o
ar d arm64.a l_abs.o norm_s.o shr.o mult_r.o l_shr_r.o l_deposit_l.o extract_l.o norm_l.o l_deposit_h.o extract_h.o l_negate.o negate.o sub.o log2.o

其中 ar d i386.a 中的 i386.a 这个就是我们上面解压删除符号后生成的文件

5, 合并文件
经过上面的操作,我们会在我们 之前 cd的那个目录下 生成了其他几个文件 arm64.a armv7.a armv7s.a i386.a x86_64.a
我们把他们合并就可以

lipo -create -output libopencore-amrnb-new.a arm64.a armv7.a armv7s.a i386.a x86_64.a

libopencore-amrnb-new.a 这个就是我们最终要成成的文件名字
到此大功告成,可以拖到项目中使用

其他问题处理

在 framework 下需要注意的就是 cd 的路径 还有在 命令的中的 .后缀 上面是加了 .a

shanshendeMacBook-Pro:IJSFoundation.framework yamanokami$ lipo IJSFoundation -thin i386 -output i386.framework

查看 解压出来的包 里面包含什么文件

 ar -v -t i386.framework

你可能感兴趣的:(多个静态库文件冲突处理方案)