最近使用Hbuilder集成一個項目,集成了很多sdk,發(fā)現(xiàn)有兩個sdk都是用了Masonry第三方庫布局,然后編譯報錯,關鍵字:duplicate symbol ,出現(xiàn)這個就表示有重復文件了,我們需要把其中的一個sdk文件中生成的重復的.o文件一一刪除即可,如下則為相關位置,我將把Masonry.framework的相關重復文件一一移除合并解決沖突問題。

步驟如下:
1.打開終端cd到所要修改的sdk所載文件目錄(最好備份一個出來,改完再替換)
2.查看靜態(tài)庫文件包含的架構(gòu):
命令: lipo -info? xxxx.a?
主要看看總共有哪些架構(gòu)有沖突,后面需要一一從相關架構(gòu)移除。如下

根據(jù)結(jié)果可以看出包含armv7 i386 x86_64? arm64?這幾個庫,沖突文件必須從必須從每個架構(gòu)的庫里面相應刪除才行,其中x86_64為模擬器的架構(gòu),如果不需要模擬器調(diào)試,嫌麻煩x86_64可以不管。具體指令集相關可以看這篇文章:http://www.itdecent.cn/p/5d1ce5d3d8d6
3.分離出相應架構(gòu)的庫:
命令: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架構(gòu)的文件列表,其實也可以在xcode編譯重復信息里面找到相關.o文件,看個人喜好。

6.接著我們就要從每個架構(gòu)文件中,刪除相關的沖突.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 所有架構(gòu)的重復文件按照上面方法刪除完成后。我們要把這幾個架構(gòu)合并到原來的庫里面
和并靜態(tài)庫的命令:
lipo -create XXXXX-armv7.a XXXXX-armv7s.a (加上所有架構(gòu)的編譯庫) -output XXXXX-NOFfmpeg.a
例:
lipo -create Masonry-x86_64 Masonry-armv7 Masonry-i386 Masonry-arm64 -output Masonry
最后將這個新生成的靜態(tài)庫文件替換掉之前的,發(fā)現(xiàn)沖突解決。
注意:當把Masonry相關沖突.o文件移除后,這個移除合并后的兼容版本是不能單獨拿去使用的,單獨使用以上移除的.o文件會出現(xiàn)丟失的編譯錯誤,因為你已經(jīng)移除了。
覺得有幫助留個贊再走唄 ~