iOS程序開發引用的第三方庫之間出現duplicate symbol時的處理方法

iOS程序集成的第三方庫過多時,很容易出現某幾個庫同時用到了一樣的函數庫,也就是在你的程序link時會提示duplicate symbol,而重複的符號又不是由你自己程序的代碼造成的,也就說沒法通過直接修改代碼把重複的符號去掉!這樣呢,要不就要求第三方庫提供方該代碼,要不就自己修改第三方庫的庫文件。第一種方法多少有點無理要求,所以還是直接用第二種方法自己解決了吧,也就是直接修改.a文件或framework裏的庫二進制文件:

這裏我只列出針對.a文件的處理方法,framework操作過程類似。

開console,找到要解剖的.a文件,執行下列命令查看庫包含的cpu架構代碼:

lipo -info libx.a
Architectures in the fat file: libx.a are: i386 armv6 armv7

然後用 lipo -extract_family armv6 -output libx-inter.a libx.a

分離出arm版本的.a,這裏有個小問題,按我的理解此命令應該對包含3種cpu代碼的.a裏的armv6部分進行操作,而實際分離出來的.a卻是同時包含armv6和armv7的部分,也就是依然是”fat” lib,這樣是不能抽出.o的,因此還需要進行以下操作:
lipo libx-inter.a -thin armv6 -output libx-armv6.a lipo libx-inter.a -thin armv7 -output libx-armv7.a
這樣就能分離出2份不同版本arm的.a了,然後進行解.o操作:
ar -x libx-armv6.a
這部操作最好放到單獨的文件夾裏進行,會將link出.a的所有.o還原出來,然後有兩種選擇:一是把所有庫對應cpu架構的部分都還原到這個位置,然後將重複的部分合併爲一份,接着用後面的命令將所有.o再合併爲一份公共lib。還有一種選擇就是保留重複符號中的一份lib完好如初,將其餘lib單獨解開,剔出重複符號存在的.o,然後將該lib重新link回.a,以去除重複符號。
不管用哪種方法解決,最後的link回命令如下:
libtool -static -o ../libx-armv6.a *.o

當然,別忘了咱們的庫都是有多份cpu架構指令的,所以,先要對每種cpu arch的庫進行同樣操作,然後還要將thin lib合併回fat lib:
lipo -create -output libx.a libx-armv6.a libx-i386.a libx-armv7.a
這樣,再link回自己的app時就不會再出現duplicate symbol了。
參考文章:

發佈了36 篇原創文章 · 獲贊 6 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章