以前我是有过专门做SDK的经验,所以像这种sdk报错遇到的不少,如图有价值也很明显的问题点在于:
duplicate symbol xxxx in xxxx
这种问题一般都是文件里面使用C语言定义的全局变量名或是函数名,在导入的时候因为重复产生了冲突。(.a用到了,我们也用到了,或者多个.a都用到)
基于此往后看,可以找出重复的文件信息,上图是 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表示支持模拟器运行
他们的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
接着我们再查看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)