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
Ответы
Ответ 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.
Надеюсь, это поможет любому, кто может бороться с этим в течение пары дней, как я:)
Шай.