2015-06-01 10 views
27

Ich habe ein Projekt, das eine Abhängigkeit (installiert über CocoaPods) mit SocketRocket hat und eine statische Bibliothek von HeapAnalytics importiert. Anscheinend verwendet die HeapAnalytics-Bibliothek SocketRocket bereits. Ich bekomme keine Fehler beim Kompilieren, aber zur Laufzeit erhalten die folgenden:Klasse ist in beiden implementiert. Einer der beiden wird verwendet werden

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

Ich bin nicht sicher, wie es zu handhaben, weil die meisten Lösungen, die ich gesehen habe, erfordern die statische Bibliothek Kompilieren selbst Klassennamen ändern und so, und Ich habe keinen Zugriff auf die Quelle.

Irgendwelche Empfehlungen?

+0

Ich denke, Sie müssen aufhören, direkt gegen 'SocketRocket' zu verlinken und stattdessen auf den mit' HeapAnalytics' enthaltenen verweisen. – Droppy

+6

Wie hörst du auf, mit etwas zu verlinken, das als eine Abhängigkeit von etwas installiert ist, das du über CocoaPods eingerichtet hast? – MrGrinst

Antwort

34

Ich schrieb, dass die Fehlermeldung! •

entweder den Namen der Klasse ändern oder verknüpfen nicht gegen die Bibliothek.

Wie ist Ihr Projekt konfiguriert? Gibt es irgendwo, wo Sie explizit gegen SR verknüpfen? Oder ist es ein Produkt der Verknüpfung mit zwei statischen Bibliotheken, die beide bereits SR enthalten?

Wenn erstere, dann stoppen Sie die Verknüpfung gegen SR direkt und erben nur die Version, die mit der Bibliothek kam bereits verwendet (Warnung: Stellen Sie sicher, es hat die richtige Version).

Wenn letzteres, dann müssen Sie eine der Bibliotheken ändern.

• Tatsächlich habe ich den Fehler geändert. Es impliziert, dass der eine oder andere verwendet werden würde. Aber das war nicht wirklich das, was vor sich ging und das Verhalten war auf verschiedenen Plattformen unterschiedlich. Daher wurde es so geändert, dass es viel präziser war, dass das Verhalten nicht definiert war.

+1

Danke bbum. Leider bestätigt dies meinen Verdacht, dass ich eine der Bibliotheken komplett modifizieren muss. – MrGrinst

+0

Nun, die Lösung war viel einfacher als ich dachte. Ich denke, ich dachte, ich müsste etwas wirklich Kompliziertes machen, aber alles, was ich tun musste, war Refactoring -> alle Vorkommen von SRWebSocket und die dazugehörigen inneren Klassen umzubenennen. Das einzige Problem, das ich damit vorhersehen kann, ist, dass wenn die Nicht-HeapAnalytics-Bibliotheken eine andere SR-Version verwenden, einige Probleme auftreten können. – MrGrinst

+0

@MrGrinst Ausgezeichnet! Ja, es gibt wirklich keine Vorstellung von Namespaces in ObjC und daher sind Kollisionen wie diese problematisch. – bbum

0

In meinem Fall erschien dieser Fehler, wenn ich unnötig eine Quelldatei sowohl mein Haupt-App Ziel und mein Testziel hinzugefügt:

Target Membership with both targets selected

das Testziel von Target Membership aus- gelöst es:

Target Membership with only one target selected

Verwandte Themen