错误: duplicate symbol '_XXX' in
一: 问题的原因
最近项目需要用到百度的语音识别,我们项目也用到了 AMR的一个三方库,这个库和百度语音识别用的是相同的三方处理音频的库,并且百度没有经过自己的包装,类似重新命名之类的
二: 问题的分析和思路
既然百度这种三方是不可能给你处理的,那么只能是我们开发者自己去处理, 解决的思路就是删除库文件中报错的符号, 今天我遇到的 .a 文件的报错,所以这个方案也是 .a 文件的处理,我估计 framework 处理方法也是一样的,我这边不处理百度的sdk 我处理的是我们使用的 ARM 这个库文件
错误出在 libopencore-amrnb.a 处理这个库
使用的工具是: ~~ lipo ar ~~
三: 实践步骤
1, cd到这个xxx.a库文件所在的文件夹目录 查看静态库支持的 CPU 环境
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