iOS "duplicate symbol"解決第三方庫之間的衝突

一、問題敘述

duplicate symbol(重複,相同的文件名)是一種常見的鏈接錯誤,不像編譯錯誤那樣可以直接定位到問題的所在。但是經過這種錯誤提示,會潛意識的反射出是文件重複了.
通常出現的情況:

1、工程文件,同一個類文件被引入了兩次

引起這種錯誤的原因大概有兩種:一是多人協作開發時,導致project文件合併衝突;二是同名文件不在同一目錄下,添加到工程時造成重複添加。 這種一般在文件視圖,用名字過濾器檢查一下就發現了。

2、 Targets的Build Phase設置項裏會出現重複

Targets的Build Phase設置項,查看Complie Sources這一項,看看出現問題的類是不是有重複的,如果重複,project文件衝突導致的。出現這種問題,只要刪除就可以了。不過,在刪除其中一個文件時,重複文件會自動全部刪除,所以還需要重新添加一次

3、引入第三方庫時與工程的文件重名衝突

如果我們的工程中引用了第三方的庫或pod入第三方庫時,而恰好第三方的庫裏面有一個,也會出現這種問題。如果不能修改第三方的庫代碼,也會出現這個錯誤,就需要解決。

小結:通常出現這個錯誤,一般都是上述情況比較容易解決,現在我們接下來就是重點要講述的,如果使用兩個靜態庫時,發生“duplicate symbol”這個衝突錯誤時,改如何解決。

二、解決兩個三方庫之間的問題

今天在寫自己一個直播項目過程中遇到用Pod集成了LFLiveKit,但不知道爲何突然出錯,然後才發現因爲我的項目中使用了GPUImage,因爲LFLiveKit這個開源庫也是有集成GPUImage,所以這就造成了衝突,產生了duplicate symbol錯誤。 我首先嚐試刪了GPUImage,但是不行,因爲項目中開發中,很多地方使用了GPUImage。 後來在網上找到了解決方法,那就是把第三方庫中的GPUImage.o刪掉。

1、查看庫所包含的CPU架構
打開終端輸入如下命令: 
第一步: cd /Users/Zhang/Desktop/temp    (自己工程的目錄)
第二部: lipo -info temp.a 
輸出結果: Architectures in the fat file: temp.a are: i386 x86_64 armv7 arm64
2、 分離不同架構的靜態庫

也就是說這裏將會從temp.a中分離出i386 、x86_64、 armv7 、arm64 四個架構下的靜態庫,分別取temp_i386.a,temp_x86_64.a,temp_armv7.a,temp_arm64.a


在終端中繼續輸入如下命令: 
第一步:lipo -extract_family i386 -output temp_i386.a temp.a 
第二步:lipo -extract_family x86_64 -output temp_x86_64.a temp.a 
第三步:lipo -extract_family armv7 -output temp_armv7.a temp.a 
第四步:lipo -extract_family arm64 -output temp_arm64.a temp.a
3、刪除靜態庫
在終端中繼續輸入如下命令:
第一步:ar -d temp_i386.a GPUImage.o 
第二步:ar -d temp_x86_64.a GPUImage.o 
第三步:ar -d temp_armv7.a GPUImage.o 
第四步:ar -d temp_arm64.a GPUImage.o 
4、合成新的靜態庫。名字爲:new_library.a

lipo -create -output new_library.a temp_i386.a temp_x86_64.a temp_armv7.a temp_arm64.a

總結:總的方法和思路是這樣的,但過程中還是會遇到不少問題,要一步步耐心的解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章