最近使用Hbuilder集成一个项目,集成了很多sdk,发现有两个sdk都是用了Masonry第三方库布局,然后编译报错,关键字:duplicate symbol ,出现这个就表示有重复文件了,我们需要把其中的一个sdk文件中生成的重复的.o文件一一删除即可,如下则为相关位置,我将把Masonry.framework的相关重复文件一一移除合并解决冲突问题。
步骤如下:
1.打开终端cd到所要修改的sdk所载文件目录(最好备份一个出来,改完再替换)
2.查看静态库文件包含的架构:
命令: lipo -info xxxx.a
主要看看总共有哪些架构有冲突,后面需要一一从相关架构移除。如下
根据结果可以看出包含armv7 i386 x86_64 arm64 这几个库,冲突文件必须从必须从每个架构的库里面相应删除才行,其中x86_64为模拟器的架构,如果不需要模拟器调试,嫌麻烦x86_64可以不管。具体指令集相关可以看这篇文章://www.greatytc.com/p/5d1ce5d3d8d6
3.分离出相应架构的库:
命令:lipo -thin armv7 XYRiskAssessment-iOS-1.0.0.a -output armv7.a
例:lipo -thin armv7 Masonry -output Masonry-armv7
然后我们就可以看到我们的sdk目录下会多一个Masonry-armv7的库,如下:
同样的方法我们可以分离出i386 x86_64 arm64 文件分离完成后如下:
4.查看库中所包含的文件列表
命令为:ar -t xxx.a
例: ar -t Masonry-armv7
5.如果不清楚两个sdk都有哪些文件重复,可以按照以上步骤,查看下另一个重复的sdk都包含哪些文件,如下所示和Masonry.framework重复的DCUniVideoPublic.framework分离出armv7架构的文件列表,其实也可以在xcode编译重复信息里面找到相关.o文件,看个人喜好。
6.接着我们就要从每个架构文件中,删除相关的冲突.o文件
命令::ar -d -sv XXXXX-armv7.a XXXX.o
例:
ar -d -sv Masonry-armv7 MASCompositeConstraint.o
ar -d -sv Masonry-armv7 MASViewConstraint.o
7.最后一步:把armv7 i386 x86_64 arm64 所有架构的重复文件按照上面方法删除完成后。我们要把这几个架构合并到原来的库里面
和并静态库的命令:
lipo -create XXXXX-armv7.a XXXXX-armv7s.a (加上所有架构的编译库) -output XXXXX-NOFfmpeg.a
例:
lipo -create Masonry-x86_64 Masonry-armv7 Masonry-i386 Masonry-arm64 -output Masonry
最后将这个新生成的静态库文件替换掉之前的,发现冲突解决。
注意:当把Masonry相关冲突.o文件移除后,这个移除合并后的兼容版本是不能单独拿去使用的,单独使用以上移除的.o文件会出现丢失的编译错误,因为你已经移除了。
觉得有帮助留个赞再走呗 ~