2015-06-01 1 views
27

У меня есть проект, который имеет зависимость (установленную через CocoaPods) с помощью SocketRocket и импортировал статическую библиотеку из HeapAnalytics. По-видимому, библиотека HeapAnalytics уже использует SocketRocket. Я не получаю ошибки при компиляции, но во время выполнения получить следующее:Класс реализован в обоих. Один из двух будет использован

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

Я не знаю, как справиться с этим, потому что большинство решений, которые я видел, требуют компиляции статической библиотеки самостоятельно изменять имена классов и такие, и У меня нет доступа к источнику.

Любые рекомендации?

+0

Я думаю, вам придется прекратить связывание с 'SocketRocket' напрямую и вместо этого полагаться на тот, который содержится в' HeapAnalytics'. – Droppy

+6

Как вы перестаете связываться с чем-то, что установлено как зависимость от того, что вы настраиваете через CocoaPods? – MrGrinst

ответ

34

Я написал это сообщение об ошибке! •

Либо изменить имя класса или не связывает с указанной библиотекой.

Как сконфигурирован ваш проект? Есть ли где-нибудь, где вы явно ссылаетесь на SR? Или это продукт, связанный с двумя статическими библиотеками, которые уже включают SR?

Если первое, то прекратите привязку к SR напрямую и просто наследуйте версию, которая поставляется с уже используемой библиотекой (предупреждение: убедитесь, что она имеет правильную версию).

Если последнее, то вам придется изменить одну из библиотек.

• Собственно, я изменил ошибку. Это подразумевало, что тот или другой будет использоваться. Но это было не совсем то, что происходило, и поведение было различным на разных платформах. Таким образом, он был изменен так, что было гораздо точнее определить, что поведение не определено.

+1

Спасибо, bbum. К сожалению, это подтверждает мои подозрения, что мне придется полностью изменить одну из библиотек. – MrGrinst

+0

Ну, исправление было намного проще, чем я думал. Думаю, я думал, что мне нужно сделать что-то действительно сложное, но все, что мне нужно было сделать, это рефакторинг -> переименовать все вхождения SRWebSocket и сопровождать внутренние классы. Единственная проблема, которую я могу предвидеть при этом, заключается в том, что если библиотеки non-HeapAnalytics используют другую версию SR, могут быть некоторые проблемы. – MrGrinst

+0

@MrGrinst Отлично! Да ... в ObjC действительно нет понятия пространств имен, и, таким образом, подобные конфликты проблематичны. – bbum

0

В моем случае эта ошибка возникла, когда я излишне добавил исходный файл как мой основной цели приложения и мой тест цель:

Target Membership with both targets selected

Удаление цели тест из Target Membership решил его:

Target Membership with only one target selected

Смежные вопросы