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

來源:互聯網
上載者:User

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?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.