Подтвердить что ты не робот

Ld: дублировать символ _objc_retainedObject на iOS 4.3, но не на iOS 5.0


Некоторый фон - я создал пользовательскую структуру с помощью руководства Diney на http://db-in.com/blog/2011/07/universal-framework-iphone-ios-2-0/

Он построен как для armv6/armv7, так и для ARC-основы, скомпилированный с целью деполяции 4.3.

Когда я помещаю результирующую фреймворк в проект 5.0, он отлично работает, но когда я помещаю его в проект 4.3 (ARC или non-arc, не имеет значения), я получаю следующее, которое я не могу понять..

Я также попытался добавить libarclite.a вручную, но ничего не изменил.

ld: дублировать символ _objc_retainedObject в /Users/freak 4pc/Project/MyFramework.framework/MyFramework и/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a(arclite.o) для архитектуры armv7 Команда /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang не удалось с кодом выхода 1

Поблагодарили бы за помощь.
Спасибо
Shai

4b9b3361

Ответ 1

Я борюсь с той же проблемой. Обходной путь таким образом задает цель развертывания вашей инфраструктуры для iOS5 (проверьте, не вызвало ли это других проблем).

Затем вы должны использовать ARC в главном проекте, если таргетинг на iOS4, иначе libarclite будет отсутствовать. Мое решение будет заключаться в поставке двух фреймворков, в зависимости от того, используют ли они ARC или нет.

Здесь две ссылки на форум Apple dev с немного дополнительной информацией: https://devforums.apple.com/message/539344#539344

https://devforums.apple.com/message/588316#588316

Обновление: Существует лучший способ. Просто создайте свою статическую библиотеку с минимальной целью iOS5 и вручную добавьте /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a(и/Developer/usr/lib/arc/libarclite_iphonesimulator.a), если ваш проект не использует ARC и нуждается в поддержке iOS4.

Обновление 2: Собственно, используйте флаг компоновщика -fobjc-arc; это свяжет libarclite с библиотекой, если она еще не там. Лучшее решение.

Ответ 2

Ничего себе, это была тяжелая поездка, но я, наконец, решил ее!

Что вызвало окончательную идею, было комментарий @steipete, Это немного сложная ситуация, поэтому я попытаюсь объяснить ее всем, кто, возможно, тоже пересек эту проблему.

  • Компиляция фреймворка с поддержкой ARC на iOS 4.3 автоматически привяжет libarclite.so к "Bridge" 4.3 ARC с 5.0 ARC. Когда эта инфраструктура была импортирована в проект 4.3, arclite фактически был связан дважды - один раз для фреймворка (который равен 4.3) и один раз для самого проекта, что вызвало ошибку "дубликат символа", что означает, что структура должна быть скомпилирована 5.0, а проект может быть 4.3. Но потом;
  • Моя инфраструктура использует @mattt AFNetworking для выполнения запросов HTTP и JSON-анализа различных APis. AFNetworking автоматически проверяет при компиляции, если ваша цель - iOS5, и если она есть, она использует NSJSONSerialization, иначе она вернется к любой импортированной библиотеке JSON, например, JSONKit.
  • При компиляции моей платформы с поддержкой AFNetworking для iOS5 (во избежание проблемы №1) она автоматически присоединяет NSJSONSerialization, что приведет к исключению из 4.3 проектов, то есть вам придется вручную искать пути компиляции и удалите вызовы на NSJSONSerialization перед компиляцией, чтобы он автоматически возвращался к 4.3-совместимой библиотеке (в моем случае JSONKit). Это условие компиляции найдено на AFHTTPClient.m и AFJSONRequestOperation.m(например, #if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_4_3 || __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_6)
  • После удаления этих условий я успешно скомпилировал мою инфраструктуру для iOS5 с помощью JSONKit вместо NSJSONSerialization и успешно смог использовать ее в своем проекте iOS4.3.

Надеюсь, это поможет любому, кто может бороться с этим в течение пары дней, как я:)

Шай.