在自己写SDK或者使用第三方库的时候,可能会遇到编译时Duplicate Symbol错误,本文就是通过使用拆分库的方法,将库中冲突的目标文件去除,以解决此类问题。
遇到此类问题,一般都是两个库中包含了相同的目标文件导致,可以通过去除其中一个库中的冲突目标文件来解决。
大致解决思路如下:
- 查看库支持的框架类型
- 使用lipo命令分别将.a拆分成库所支持框架类型的.a库
- 使用ar命令删除对应框架类型.a库中冲突的.o目标文件
- 使用lipo命令将处理后的各个框架.a库进行合并即可
具体操作步骤如下
- 查看库支持的框架类型
现有的框架类型应该就是i386、x86_64、armv7、arm64这个几个了,这里以微信的SDK为例,在终端中对应路径下输入以下命令,查看支持的框架类型
lipo -info libWeChatSDK.a
在终端可以看到结果,支持armv7、i386、x86_64、arm64这个几个框架类型
Architectures in the fat file: libWeChatSDK.a are: armv7 i386 x86_64 arm64
- 使用lipo命令分别将.a拆分成库所支持框架类型的.a库
因为微信的SDK支持armv7、i386、x86_64、arm64这个几个框架类型,所以我们需要分别将其拆分成对应的四个框架类型的库,输入以下命令
lipo libWeChatSDK.a -thin armv7 -output libWeChatSDK_armv7.a
lipo libWeChatSDK.a -thin i386 -output libWeChatSDK_i386.a
lipo libWeChatSDK.a -thin x86_64 -output libWeChatSDK_x86_64.a
lipo libWeChatSDK.a -thin arm64 -output libWeChatSDK_arm64.a
可以看到以下生成的几个文件
libWeChatSDK_arm64.a libWeChatSDK_x86_64.a
libWeChatSDK_armv7.a libWeChatSDK_i386.a libWeChatSDK.a
- 使用ar命令删除其中一个.a的冲突的.o
如果Xcode里提示Duplicate Symbol都是说xxx.o与xxx.o冲突,则我们就删除的对应的xxx.o目标文件,比如我们删除amr64框架下面的xxx.o目标文件,输入以下命令
ar -d libWeChatSDK_arm64.a xxx.o
这里,只需要删除冲突框架中的xxx.o文件即可,比如说,只有在i386这个框架下,编译报错提示提示Duplicate Symbol都是说xxx.o与xxx.o冲突,其他框架编译正常,则只需要输入以下命令即可
ar -d libWeChatSDK_i386.a xxx.o
- 使用lipo命令将处理后的各个框架.a库合并
当我们将冲突的目标文件删除之后,我们可以做收尾工作了。将处理过的的各个框架类型的库进行合并,命令如下
lipo -create -output libWeChatSDK.a libWeChatSDK_i386.a libWeChatSDK_x86_64.a libWeChatSDK_armv7.a libWeChatSDK_arm64.a
合并之后,记得检查一下合并库支持的框架类型,看看有没有遗漏
lipo -info libWeChatSDK.a
看到支持的框架
Architectures in the fat file: libWeChatSDK.a are: armv7 i386 x86_64 arm64
这就没有遗漏了
到此,将合并后的库重新添加到工程中,测试一下,如果将所有冲突的目标文件都去除了,冲突问题因此解决了。