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

У меня есть проект без поддержки 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 ]

30 голосов
/ 06 января 2012

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

5 голосов
/ 28 марта 2012

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

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

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

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

...