2015-01-01 77 views
33

我得到這樣的警告:類X在兩個<framework>和<application>兩個中的一個將被使用,其中一個是不確定的實施

Class X is implemented in both <framework> and <application> one of the two will be used, which one is undefined 

此警告覆蓋相當多的在網絡上,但我還沒有找到任何答案,我遇到的具體問題。

方案

我已經建立了MyFramework和MyApplication的(作爲一個MyFramework測試/演示程序)。

MyFramework使用CocoaPod(我將其稱爲CoolPod),我也希望在MyApplication中使用它(並且假設MyFramework的使用者也是合理的)。

我需要能夠將MyFramework作爲.framework(對於封閉源代碼)進行分發。但是,這意味着MyFramework將CoolPod嵌入到其編譯的庫中。

現在,當我將MyFramework和CoolPod導入到MyApplication中時,由於CoolPod的類已包含在MyFramework的庫中(因爲CoolPod已嵌入),因此我得到了此衝突(輸出上面顯示的警告)。

所以我們有這樣的結構:

CoolPod -> MyFramework \ 
         MyApplication 
       CoolPod/

問題

如何避免這個矛盾呢?

  • 有沒有辦法讓我的MyApplication提供CoolPod到MyFramework?
  • 我是否必須通過MyFramework管道CoolPod的標題?

我想過在MyApplication中包含CoolPod的頭文件(但不是它的lib),然而這看起來過於複雜,應該是一個簡單的例子。

任何幫助,非常感謝,這是真的阻止我現在。

感謝,

靛藍

+2

我有類似的問題,你有沒有找到一個解決方案? – cocoapriest

+0

類似的問題,但與單元測試,在這裏討論:http://stackoverflow.com/questions/6149673/class-foo-is-implemented-in-both-myapp-and-myapptestcase-one-of-the-two -will-be – ThomasW

+1

令人驚訝 - 這不是一個真正常見的模式嗎?開發人員不希望能夠創建編譯單元的DAG,而不必擔心會發生碰撞?! – fatuhoku

回答

2

我的解決方案是從可可豆中獲取源代碼併爲其創建一個Cocoa Touch框架。然後我將框架鏈接到我的api和我的測試應用程序。 這不是很好,但它是我所能做的。我相信Cocoapods正在支持框架,所以這個解決方案可能會很快過時。

我的公司還使用gradle進行依賴關係(java)並構建腳本。所以我創建了groovy/gradle構建任務,構建了我的框架和我的支持框架(cocoapod框架),並從中創建了一個通用框架。然後它將所有的框架都拉下來。這意味着我可以分發一個包含所有要求的郵政編碼。這顯然不是最好的分發方式(我們將轉向通過Cocoapods進行分發,並且依賴於我們的閉源框架),但它的安裝速度很快。

2

對於封閉源代碼的靜態庫,我們建議cocoapods-packager。我不確定它是否支持框架。

1

一個解決方案是打開use_frameworks!在框架的Podfile中。然後,您仍然可以編譯您的框架,並將您的框架嵌入到目標應用程序中。警告消息將消失(這是因爲框架的pod符合另一個框架,但不會將其嵌入到目標應用程序中,然後您的應用程序將引用它自己的二進制文件)。

但是,不是一個好的解決方案,原因有兩個: 1.您需要確保目標應用程序包含框架所需的必需的窗格。 2.應用程序可能會在框架中使用不同的pod版本。如果框架和應用都引用相同的pod二進制文件,則可能導致崩潰。

我懷疑這個問題有很好的解決方案。

1

如果您想要一個快速解決方案 - 只需將MyFramework項目作爲子項目添加到MyApplication項目。你仍然可以使用可可豆莢爲您的框架和測試應用程序(但包括您的「常見」與豆莢只有框架項目的庫)

+0

我無法使這種方法奏效 - 應用程序目標不會與僅在框架中包含的窗格中定義的任何類的「架構arm64中找不到的符號」鏈接。有任何想法嗎? – StephenT

+0

這對我有用。我只需刪除我的派生數據即可使其運行 – Alpine

相關問題