在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