該篇文章是我自己從我的新浪博客上摘抄過來的, 原文鏈接為: http://blog.sina.com.cn/s/blog_dcc636350102wat5.html
在iOS開發(fā)中挺勿, 難免會集成別人的三方類庫裁眯, 當(dāng)集成的三方類庫過多時(shí)智什, 難免會出現(xiàn)某些庫同時(shí)使用了同樣的函數(shù)庫漆枚,導(dǎo)致link的時(shí)候報(bào)錯提示duplicate symbol竞川。詳情見圖:
這樣的報(bào)錯讓我們覺得很麻煩棋嘲, 這樣的文件重復(fù)錯誤酒唉, 不是由自己的程序中的代碼造成的, 而是別人的三方類庫沸移, 也就是說痪伦,這種情況下, 我們沒有辦法通過修改自己的代碼而使問題得到解決雹锣。 我們就只能要求第三方(函數(shù)庫的提供方)提供源碼网沾, 然后自己修改,或者是讓三方代碼提供者自己修改了之后給我們蕊爵, 不管怎樣辉哥, 多少會覺得有點(diǎn)無理要求了。 那么我們就只能想想辦法自己解決了攒射, 也就是修改.a文件或者framework中的二進(jìn)制文件醋旦。
修改這樣的錯誤, 我們需要用到lipo 和 ar 工具会放。 不知道用法的可以網(wǎng)上稍微搜索一下饲齐。
那么我們現(xiàn)在就來修改一下吧。
一咧最、找到重復(fù)的庫文件(兩個庫文件重復(fù)找其中之一即可箩张, 三個庫文件, 找到重復(fù)文件的其中兩個窗市, .....以此類推)先慷,你可以直接在該項(xiàng)目下的文件夾進(jìn)行操作(不建議, 容易使程序出問題)咨察,你也復(fù)制這些庫文件到其它文件夾進(jìn)行操作论熙。我們這里復(fù)制到其它文件夾下進(jìn)行操作。需要復(fù)制的文件見圖:
二摄狱、打開終端脓诡, 并cd 到文件夾下无午, 使用 lipo -info ASIAIDCardReader (ASIAIDCardReader替換為自己的文件名稱)查看該文件下的架構(gòu)信息, 留待后用
三祝谚、我們可以看最后一行信息宪迟, 此處 Architecturesin the fat file, 說明此處是一個fat文件交惯, 我們需要對該文件先進(jìn)行瘦身次泽, 即分離出armv7、arm64和armv7s文件席爽。
使用命令 lipo ASIAIDCardReader -thin armv7-output ASIAIDCardReader.armv7 (ASIAIDCardReader.armv7 中ASIAIDCardReader 可替換為自己的文件名稱意荤,且該名稱可以自定義), 使用類似的方法(只需要將 .armv7修改為相應(yīng)的架構(gòu)信息后綴即可)只锻,分離出其它的文件
四玖像、文件已經(jīng)分離出來, 下面我們使用ar 工具齐饮, 查看各文件下的二進(jìn)制文件(.o文件)捐寥。 此處我們可以使用 ar -t在終端中查看所有的.o文件
也可以使用 ar -x將所有.o文件分離到指定的目錄文件夾。
根據(jù)我們最開始的錯誤定位祖驱,從上面我們都能輕易找到重復(fù)的文件 AsyncSocket.o和AsyncSocket相關(guān)的文件握恳,接下來就是對分離出來的文件進(jìn)行修改了。
五羹膳、使用命令 ar -d -sv ASIAIDCardReader.armv7s AsyncSocket.o,即刪除ASIAIDCardReader.armv7s下的 AsyncSocket.o二進(jìn)制文件(你只需要替換成你自己的庫文件名稱和.o文件即可)睡互,同樣對分離出來的.arm64根竿、.armv7s進(jìn)行同樣的操作陵像。
六、文件修改好了寇壳, 接下來我們需要把修改好的文件醒颖,全部再組合成我們原來的framework下的fat文件。使用命令
lipo-create -output ASIAIDCardReaderASIAIDCardReader.armv7sASIAIDCardReader.arm64 ASIAIDCardReader.armv7(此處需要把所有分離出來的文件都加上)
為了使我們確認(rèn)還原了ASIAIDCardReader文件壳炎, 我們將復(fù)制文件夾下的該文件刪除泞歉, 再進(jìn)行操作。使用命令之后匿辩, 我們就能看到生成了一個新的 ASIAIDCardReader文件腰耙, 這就是我們修改之后,符合我們需求的文件了铲球。
七挺庞、將修改好的文件, 拖拽到原文件夾下稼病,替換原文件即可选侨。
注:其它由重復(fù)的framework掖鱼, 按照以上方法重復(fù)一遍即可。