近期项目中要集成直播的sdk,项目配置完成后编译报了如下错误:
1081561530148_.pic_hd.jpg
从图中可以知道我去了哪里(前面面试总结文章有人好奇)。 回到正题,以前我是有过专门做SDK的经验,所以像这种sdk报错遇到的不少,如图有价值也很明显的问题点在于:
duplicate symbol xxxx in xxxx
这种问题一般都是文件里面使用C语言定义的全局变量名或是函数名,在导入的时候因为重复产生了冲突。 基于此往后看,可以找出重复的文件信息,上图是 SAMKeychain 和 SAMKeychainQuery,解决方案就是从.a中把这些重复的.o删除。(附带一个不高级方法,若冲突的文件你能修改,也可以直接改名)
OK,开始解决问题,解决问题还得从我们导入的第三方静态库入手,我们用的直播sdk,先用命令行查看它的相关信息:
cd /Users/zlwh/Desktop/微吼直播sdk
lipo -info libVHallSDK.a
Architectures in the fat file: libVHallSDK.a are: armv7 i386 x86_64 arm64
这里插播一下: arm64,armv7s,armv7,他们是ARM处理器的指令集,是在手机上的 i386|x86_64 是Mac处理器的指令集,i386表示支持模拟器运行
image.png
他们的sdk有说明,只支持iphone 5s以上的手机,所以在sdk中没有打包armv7s的架构。我们在命令行中得到的信息 Architectures in the fat file: libVHallSDK.a are: armv7 i386 x86_64 arm64 看好这个fat,fat file表示这个库里面合并了多于1个框架。而删除.0不能在这种fat file里,所以我们还得从库中拆分出arm64类型的.a
lipo libVHallSDK.a -thin arm64 -output lib64.a
这行命令运行后,我们的文件夹中会多出一个lib64.a
image.png
接着我们再查看lib64.a的相关信息:
lipo -info lib64.a
Non-fat file: lib64.a is architecture: arm64
此时它已经是一个只有arm64框架的.a了,接下来我们就可以执行删除.o的命令了
ar -d lib64.a SAMKeychain.o
ar -d lib64.a SAMKeychainQuery.o
这时候我们得到的就是剔除了两个重复.o的.a库。 把它拖入工程替换原有的.a,再运行就没有问题了。
以上问题就解决了,这里总结一些lipo命令: 1.依次查看所有需要合并的lib库所支持的框架类型 lipo -info xxx.a
2.将lib库拆分出不同类型的.a(armv7、armv7s、i386等)(i386表示支持模拟器) lipo xxx.a -thin arm64 -output xxx.a lipo xxx.a -thin armv7s -output xxx.a
3.删除.a库中的.o ar -d xxx.a xxx.o
4.分离出目标文件(.o) ar -x ../xxx.a
5.从.o文件中合并成静态库: libtool -static -o ../xxx.a *.o
6.合并静态库 lipo -create 111.a 222.a 333.a -output 444.a (表示将111.a、222.a、333.a合并成444.a)