from:http://blog.k-res.net/archives/1024.html
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?