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

 
該篇文章是我本身從個人新浪博客上摘抄過來的, 原文連接爲:  http://blog.sina.com.cn/s/blog_dcc636350102wat5.html
 
 
在iOS開發中, 不免會集成別人的三方類庫, 當集成的三方類庫過多時, 不免會出現某些庫同時使用了一樣的函數庫,致使link的時候報錯提示duplicate symbol。詳情見圖:
 


 
這樣的報錯讓咱們以爲很麻煩, 這樣的文件重複錯誤, 不是由本身的程序中的代碼形成的, 而是別人的三方類庫, 也就是說,這種狀況下, 咱們沒有辦法經過修改本身的代碼而使問題獲得解決。 咱們就只能要求第三方(函數庫的提供方)提供源碼, 而後本身修改,或者是讓三方代碼提供者本身修改了以後給咱們, 無論怎樣, 多少會以爲有點無理要求了。  那麼咱們就只能想一想辦法本身解決了, 也就是修改.a文件或者framework中的二進制文件。
 
修改這樣的錯誤, 咱們須要用到lipo 和 ar 工具。 不知道用法的能夠網上稍微搜索一下。
 
那麼咱們如今就來修改一下吧。
 
 
1、找到重複的庫文件(兩個庫文件重複找其中之一便可, 三個庫文件, 找到重複文件的其中兩個, .....以此類推),你能夠直接在該項目下的文件夾進行操做(不建議, 容易使程序出問題),你也複製這些庫文件到其它文件夾進行操做。咱們這裏複製到其它文件夾下進行操做。須要複製的文件見圖:


 
2、打開終端, 並cd 到文件夾下, 使用  lipo -info    ASIAIDCardReader (ASIAIDCardReader替換爲本身的文件名稱)查看該文件下的架構信息, 留待後用
 
 
3、咱們能夠看最後一行信息, 此處 Architecturesin the fat file, 說明此處是一個fat文件, 咱們須要對該文件先進行瘦身, 即分離出armv七、arm64和armv7s文件。   
使用命令 lipo ASIAIDCardReader -thin armv7-output ASIAIDCardReader.armv7 (ASIAIDCardReader.armv7 中ASIAIDCardReader 可替換爲本身的文件名稱,且該名稱能夠自定義), 使用相似的方法(只須要將 .armv7修改成相應的架構信息後綴便可),分離出其它的文件
 


4、文件已經分離出來, 下面咱們使用ar 工具, 查看各文件下的二進制文件(.o文件)。 此處咱們可使用 ar -t在終端中查看全部的.o文件


 也可使用 ar -x將全部.o文件分離到指定的目錄文件夾。


根據咱們最開始的錯誤定位,從上面咱們都能輕易找到重複的文件 AsyncSocket.o和AsyncSocket相關的文件,接下來就是對分離出來的文件進行修改了。
 
 
5、使用命令 ar -d -sv ASIAIDCardReader.armv7s AsyncSocket.o,即刪除ASIAIDCardReader.armv7s下的 AsyncSocket.o二進制文件(你只須要替換成你本身的庫文件名稱和.o文件便可),一樣對分離出來的.arm6四、.armv7s進行一樣的操做。 
 


 
6、文件修改好了, 接下來咱們須要把修改好的文件,所有再組合成咱們原來的framework下的fat文件。使用命令 
 lipo-create -output ASIAIDCardReaderASIAIDCardReader.armv7sASIAIDCardReader.arm64 ASIAIDCardReader.armv7(此處須要把全部分離出來的文件都加上)
爲了使咱們確認還原了ASIAIDCardReader文件, 咱們將複製文件夾下的該文件刪除, 再進行操做。使用命令以後, 咱們就能看到生成了一個新的 ASIAIDCardReader文件, 這就是咱們修改以後,符合咱們需求的文件了。 
 
7、將修改好的文件, 拖拽到原文件夾下,替換原文件便可。 
 
注:其它由重複的framework, 按照以上方法重複一遍便可。
 
好了, 按照這樣的方法, 我解決了本身的問題, 有什麼不對的地方, 還但願你們多多指點, 最後,此教程藉助博客:http://angelolloqui.com/blog/31-How-to-fix-a-Duplicated-Symbols-error-on-binary-files
相關文章
相關標籤/搜索