2015-06-01 11 views
27

Ho un progetto che ha una dipendenza (installata tramite CocoaPods) usando SocketRocket e ho importato una libreria statica da HeapAnalytics. Apparentemente la libreria HeapAnalytics utilizza già SocketRocket. Ottengo errori durante la compilazione, ma in fase di esecuzione viene visualizzato il seguente:La classe è implementata in entrambi. Uno dei due sarà utilizzato

Class SRWebSocket is implemented in both [path] and [path]. 
One of the two will be used. Which one is undefined. 

Non sono sicuro di come gestire la cosa perché la maggior parte soluzioni che ho visto richiedono la compilazione della libreria statica da soli cambiare i nomi di classe e simili, e Non ho accesso alla fonte.

Qualche consiglio?

+0

Immagino che dovrai interrompere il collegamento con 'SocketRocket' direttamente e invece fare affidamento su quello contenuto in' HeapAnalytics'. – Droppy

+6

Come si interrompe il collegamento con qualcosa che viene installato come dipendenza da qualcosa che si installa tramite CocoaPods? – MrGrinst

risposta

34

ho scritto quel messaggio di errore! •

O cambiare il nome della classe o non collegare contro detto biblioteca.

Come viene configurato il progetto? C'è un posto in cui esplicitamente ti colleghi a SR? O è un prodotto di collegamento a due librerie statiche che già includono già SR?

Se il primo, interrompe il collegamento diretto con SR, eredita la versione fornita con la libreria già in uso (avviso: assicurarsi che abbia la versione corretta).

Se quest'ultimo, quindi, si dovrà modificare una delle librerie.

• In realtà, ho modificato l'errore. Era solito intendere che uno o l'altro sarebbe stato usato. Ma non era proprio quello che stava succedendo e il comportamento era diverso su piattaforme diverse. Pertanto, è stato modificato in modo che fosse molto più preciso nell'identificare che il comportamento non era definito.

+1

Grazie bbum. Sfortunatamente, ciò conferma i miei sospetti che dovrò modificare completamente una delle librerie. – MrGrinst

+0

Beh, la soluzione era molto più semplice di quanto pensassi. Credo di aver pensato di dover fare qualcosa di veramente complicato, ma tutto ciò che dovevo fare era refactoring -> rinominare tutte le occorrenze di SRWebSocket e le classi interne che lo accompagnano. L'unico problema che posso prevedere con questa operazione è che se le librerie non HeapAnalytics utilizzano una versione diversa di SR, potrebbero esserci alcuni problemi. – MrGrinst

+0

@MrGrinst Eccellente! Sì, non c'è davvero una nozione di namespace nell'Obiec e, quindi, collisioni come questa sono problematiche. – bbum

0

Nel mio caso questo errore è apparso quando ho inutilmente aggiunto un file di origine sia il mio obiettivo applicazione principale e il mio obiettivo di prova:

Target Membership with both targets selected

Rimozione del target di test da Target Membership risolto:

Target Membership with only one target selected