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了。
參考文章:
- http://bbs.51cto.com/topic/thread-845884.html 使用多個第三方庫出現duplicate symbol的解決辦法
- http://stackoverflow.com/questions/5352113/how-do-i-turn-a-fat-library-into-a-non-fat-library How do I turn a “fat” library into a “non-fat” library?