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

Статическая библиотека с поддержкой 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 решает проблему, но Id нравится знать, есть ли другие решения.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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