Статическая библиотека с поддержкой ARC, связанная с не-ARC проектом, вызывающая ошибки компоновщика

У меня есть проект без поддержки ARC, в котором используется статическая библиотека с поддержкой ARC. Это поддерживаемый сценарий, так что все работает нормально. То есть, пока я не запустил код на устройстве 4.x, включая Simulator. В этом случае код взрывается со следующей ошибкой компоновщика:

dyld: lazy symbol binding failed: Symbol not found: _objc_storeStrong
  Referenced from: /Users/zoul/Library/Application Support/iPhone Simulator/4.3.2/Applications/…/Demo.app/Demo
  Expected in: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/Foundation.framework/Foundation

Это происходит, как только некоторые из кодов с поддержкой ARC пытаются вызвать _objc_storeStrong функция, как в init метод (self = [super init]). Преобразование основного проекта в ARC решает проблему, но я хотел бы знать, есть ли другие решения.

2 ответа

Решение

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

Глядя на стенограмму сборки, вы действительно можете найти соответствующий флаг компоновщика: он называется -fobjc-arc (так же, как связанный флаг компилятора). Когда вы добавляете этот параметр в другие флаги компоновщика, компоновщик будет включать библиотеку ARC с основным продуктом сборки, и код должен работать нормально.

Я добавляю новый ответ на это, так как предыдущее принятое решение больше не работает с Xcode 4.3.2. Я могу только предположить, что -fobjc-arc флаг компоновщика никогда не должен был быть выставлен и теперь был удален.

Похоже, это известная проблема, хотя единственная тема, которую я могу найти по этому поводу, когда кто-то из Apple комментирует devforums, относится к середине 2011 года. Из этого потока предлагается, что ручное связывание следующего файла решает проблему:

${DEVROOT}/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a

Это требует от вас компиляции с использованием новейшего компилятора /SDK. Я отправляю этот ответ без тестирования. Пожалуйста, подтвердите, если он работает, или уменьшите, если это не так!

Другие вопросы по тегам