以前我是有過專門做SDK的經(jīng)驗(yàn)迈勋,所以像這種sdk報(bào)錯(cuò)遇到的不少胳蛮,如圖有價(jià)值也很明顯的問題點(diǎn)在于:
duplicate symbol xxxx in xxxx
這種問題一般都是文件里面使用C語言定義的全局變量名或是函數(shù)名,在導(dǎo)入的時(shí)候因?yàn)橹貜?fù)產(chǎn)生了沖突。(.a用到了搞隐,我們也用到了晨缴,或者多個(gè).a都用到)
基于此往后看译秦,可以找出重復(fù)的文件信息,上圖是 SAMKeychain 和 SAMKeychainQuery击碗,解決方案就是從.a中把這些重復(fù)的.o刪除筑悴。(附帶一個(gè)不高級方法,若沖突的文件你能修改稍途,也可以直接改名)
OK阁吝,開始解決問題,解決問題還得從我們導(dǎo)入的第三方靜態(tài)庫入手械拍,我們用的直播sdk,先用命令行查看它的相關(guān)信息:
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處理器的指令集,是在手機(jī)上的
i386|x86_64 是Mac處理器的指令集突勇,i386表示支持模擬器運(yùn)行
他們的sdk有說明装盯,只支持iphone 5s以上的手機(jī),所以在sdk中沒有打包armv7s的架構(gòu)甲馋。我們在命令行中得到的信息
Architectures in the fat file: libVHallSDK.a are: armv7 i386 x86_64 arm64
看好這個(gè)fat,fat file表示這個(gè)庫里面合并了多于1個(gè)框架埂奈。而刪除.0不能在這種fat file里,所以我們還得從庫中拆分出arm64類型的.a
lipo libVHallSDK.a -thin arm64 -output lib64.a
這行命令運(yùn)行后定躏,我們的文件夾中會(huì)多出一個(gè)lib64.a
接著我們再查看lib64.a的相關(guān)信息:
lipo -info lib64.a
Non-fat file: lib64.a is architecture: arm64
此時(shí)它已經(jīng)是一個(gè)只有arm64框架的.a了挥转,接下來我們就可以執(zhí)行刪除.o的命令了
ar -d lib64.a SAMKeychain.o
ar -d lib64.a SAMKeychainQuery.o
這時(shí)候我們得到的就是剔除了兩個(gè)重復(fù).o的.a庫。
把它拖入工程替換原有的.a共屈,再運(yùn)行就沒有問題了绑谣。
以上問題就解決了,這里總結(jié)一些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.分離出目標(biāo)文件(.o)
ar -x ../xxx.a
5.從.o文件中合并成靜態(tài)庫:
libtool -static -o ../xxx.a *.o
6.合并靜態(tài)庫
lipo -create 111.a 222.a 333.a -output 444.a
(表示將111.a、222.a矾削、333.a合并成444.a)