描述
最近项目中用到了百度语音唤醒和识别的相关功能,集成百度SDK后,发现我们项目中原来的音视频聊天功能不可用,现象就是接通以后2秒后卡死并闪退,最后定位到我们原来项目中的webrtc库和百度的SDK存在冲突(百度SDK中有用到webrtc的相关.o)。
查找问题阶段
找到两个冲突的.a后,就要搞清楚到底是哪里出现了冲突:
首先就要把两个.a解开,看看.a中到底存在什么:
网上有好多解决.a冲突的文章,大部分都是通过lipo 来解决
- 查看.a里面的架构
lipo -info xxx.a
- 创建文件夹由于到合并多个包,所以需要先分好类后,再进行此操作
mkdir armv7
- 提取armv7,平台的包在第一步中,可以看到支持的各个平台。
lipo xxx.a -thin armv7 -output armv7/xxx-armv7.a
- 解压.a文件,可以使用命令先进行查看.a包中的文件列表
ar -t armv7/xxx-armv7.a
- 解压.a包(内部都是.o文件)
cd armv7
ar xv xxx-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 xxx-armv7.a xxx-arm64.a xxx-i386.a xxx-x86_64.a -output yourself.a
以上是我解开.o采用的方法
虽然解开了,两个.o比对以后也找到了同名文件,删除其中一个后合成.a放到项目中,依然没有解决问题。
然后没办法只能根据xcode中的报错一步一步进行解决,报错中显示![](https://img.haomeiwen.com/i4624177/bec88162a56fed02.png)
如上,表明有大量符号缺失然后我就在新合成的.o中查找缺失的符号:
nm /Users/wbb/Desktop/arm64/libabd.a | grep vad_free
nm /Users/wbb/Desktop/arm64/libBDVoiceRecognitionClient-arm64.a | grep easr_engine
发现新合成的.a确实没有对应的符号。
同样的方法我在老的.a中却找到了对应的符号。最后通过多番查找发现合成或者解压.a后会出现符号丢失的现象。
最后的解决方案
采用命令行的方式删除(既不采用解压,删除后在合成的方式,直接用命令删除对应的.o),当然前提是在分离成arm64,armv7以后
ar -d /Users/wbb/Desktop/arm64/libBDVoiceRecognitionClient-arm64.a min_max_operations.o
ar -d /Users/wbb/Desktop/arm64/libBDVoiceRecognitionClient-arm64.a real_fft.o
期间用到的命令(待更新):
# 这里是将.a转成小文件,方便查找
nm /Users/wbb/Desktop/库文件冲突/libBDVoiceRecognitionClient-arm64.a > bdnew
# 查看该文件
vim bdnew
# 斜杠 符号来全局查找
/ easr_engine
# 查看历史命令
history|grep ar
#man 命令
man ar
# 创建脚本
vim merge.sh
# 查看脚本里面的命令
cat merge.sh
# 执行脚本
sh merge.sh
# 创建实体armv7文件夹
mkdir armv7
#这个就是取value的前四位
value="group"
echo ${value:0:4}
网友评论