ld: дублированный символ _objc_retainedObject на iOS 4.3, но не на iOS 5.0 - PullRequest
12 голосов
/ 04 декабря 2011

Немного предыстории - я создал собственную платформу, используя руководство Дайни по адресу 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/freak4pc/Project/MyFramework.framework/MyFramework and /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/liosclaar.o) для архитектуры armv7 Команда /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang завершилась неудачно с кодом выхода 1

Буду признателен за любую помощь в этом.СпасибоШай

Ответы [ 2 ]

15 голосов
/ 06 декабря 2011

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

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

Вот две ссылки на форум разработчиков Apple с чуть большей информацией: 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 голосов
/ 07 декабря 2011

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

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

  1. Компиляция платформы с поддержкой ARC в iOS 4.3 автоматически присоединит libarclite.so к «мосту» 4.3 ARC с 5.0 ARC. Когда этот каркас был импортирован в проект 4.3, arclite был фактически связан дважды - один раз для каркаса (который является 4.3), и один раз для самого проекта - что вызвало ошибку «дубликата символа», что означает, что каркас должен быть скомпилирован на 5.0, а проект может быть 4.3. Но потом ;
  2. Моя структура использует AFNetworking @mattt для выполнения HTTP-запросов и анализа JSON различных APis. AFNetworking автоматически проверяет во время компиляции, является ли ваша цель iOS5, и если это так, она использует NSJSONSerialization, в противном случае она будет использовать любую импортированную библиотеку JSON, такую ​​как JSONKit.
  3. При компиляции моей платформы с поддержкой 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)
  4. После устранения этих условий я успешно скомпилировал мою платформу для iOS5 с JSONKit вместо NSJSONSerialization и смог успешно использовать ее в моем проекте iOS4.3.

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

Шай.

...