2017-04-19 68 views
0

我必須在我的應用程序中使用第三方框架。但是,當我包括框架項目中,我得到鏈接錯誤類似如下:iOS框架中的重複符號

duplicate symbol _SRHTTPResponseErrorKey in: 
    Shared/Libraries/XXX.framework/XXXSDK(SRWebSocket.o) 
    Shared/Libraries/YYY.framework/YYYSDK(YYYSRWebSocket.o) 

有沒有解決這樣的錯誤,而不改變框架(S)的方法嗎?

回答

2

問題是框架和你的代碼(或你的另一個框架)包含相同的類/框架。框架開發人員認爲,將自己的框架作爲另一個框架的保護傘是一個好主意 - 事實並非如此。框架不應該包含另一個框架。

BTW:這就是爲什麼你的ObjectiveC框架的每個類都應該有一個前綴。它降低了衝突的可能性。

有以下解決方案爲您提供:

  1. 如果添加了兩個相互矛盾的一類:重命名你的代碼的類。也許分叉框架並更改所有類的前綴或使用3)中的技術創建包裝框架。

  2. 要求開發人員刪除所有外部代碼並僅將其鏈接。此外,他/她必須記錄依賴關係,以便框架的用戶知道他/她必須添加哪個版本中的哪一個。你可以使用像CocoaPods/Carthage或makefile這樣的依賴框架,而不是取得依賴的框架。

  3. 如果2)是不可能的,因爲該框架將被其他客戶使用,並且開發人員不會破壞他們的代碼(通過這種方式愚蠢的原因):要求開發人員爲每個類添加是不是他自己的代碼「其他C標誌」等記載here

+0

他們可能改名爲類(參見'SRWebSocket'和問題'YYYSRWebSocket')。他們可能錯過了一些常數。但是,一個遺漏的符號足以導致問題......可能只需從類中移除該符號就足夠了,因爲它已經包含在框架中。 – Sulthan

+0

是的,你是對的,沒有看到:) – ObjectAlchemist

+0

順便說一句,在另一個框架內包含框架的原因是爲了隱藏實現,例如,如果你的cocoapod包含一個帶有編譯代碼和框架的靜態庫。我相信谷歌分析正在這樣做。 – Sulthan