一、问题场景
iOS 端在集成腾讯云视频服务客户端音视频SDK时,与开发者自己工程中的第三方库冲突,导致编译报错。
二、解决方案
场景1
编译报dumplicate symbols
错误。
解决办法
一般是因为 other linker flags
设置了-all_load
,去掉这个,只需要设置-ObjC
。
场景2
ffmpeg 和 ijk 相关冲突。
解决办法
全功能专业版和独立播放器版、企业版等版本中都包含有 ffmpeg 和 ijkplayer,如果您的项目中已经包含相关开源库,推荐使用 精简版
或 符号重命名版
。
场景3
工程里面与 TXLiteAVSDK 内部引用的库重复。
解决办法
直接删除本地工程里面重复的库文件。
场景4
工程里面三方库与TXLiteAVSDK有相同的.o文件。
解决办法
这种情况发生在不能直接删除对应的三方库场景,那么可以删除这个三方库里面冲突的.o文件然后重新打包,就不会冲突了。
命令行:
lipo -info libexample.a
如提示fat file
,代表这个包是支持多平台的,需要逐一解包然后重打包。
例如:Architectures in the fat file: libexample.a are: i386 armv7 armv7s x86_64 arm64
那么我们需要重复5次以下步骤。
解包、打包步骤:
- 创建临时文件夹,用于存放解压后的.o文件,如i386:
mkdir i386
- 取出i386平台的包:
lipo libexample.a -thin i386 -output i386/ libexample-i386.a
- 查看库中所包含的文件列表:
cd i386 && ar -t libexample-i386.a
- 解压出 object file(.o后缀文件):
ar xv libexample-i386.a
- 找到要删除的包(someframework.o)删掉:
rm someframework.o
- 重新打包object file:
cd .. && ar rcs libexample-i386.a i386/*.o
,可再次输入2-5中的命令检验是否删除成功 - 将其他几个平台包逐一做上述1-6操作
- 重新合并为fat file的.a文件:
lipo -create libexample-armv7.a libexample-armv7s.a libexample-i386.a -output libexample-new.a
三、原理
lipo是管理Fat File的工具, 可以查看cpu架构, 提取特定架构,整合和拆分库文件。
- lipo -info xxxx.framework(查看信息)
- lipo -create xxxx xxxx -output xxxx(整合成Fat文件)
- lipo xxxx -thin cpu(armv7/arm64等) -output xxxx(提取特定的cpu架构的thin文件)
- lipo -remove cpu(armv7/arm64等) xxxx -output xxxx(移除掉特定的cpu架构的文件)