Ошибка компоновщика при компиляции приложения iOS 5 для симулятора — неопределенные символы: _objc_assign_global, _objc_assign_ivar и _objc_assign_strongCast

#objective-c #xcode #linker-errors #automatic-ref-counting #ios-simulator

#objective-c #xcode #компоновщик-ошибки #автоматический подсчет ссылок #ios-симулятор

Вопрос:

Мой проект больше не компилируется для симулятора iOS 5.0 после обновления до автоматического подсчета ссылок. Он по-прежнему безупречно компилируется для любого устройства iOS.

Кроме того, после обновления до iOS 5, но до перехода на автоматический подсчет ссылок, мой проект будет скомпилирован безупречно как для устройства, так и для симулятора.

Компоновщик сообщает, что не может найти следующие символы:

  • _objc_assign_global
  • _objc_assign_ivar
  • _objc_assign_strongCast

Сначала я подумал, что мне может не хватать платформы, специфичной для симулятора, но после добавления всех доступных фреймворков я все равно получаю те же ошибки.

Другая информация

  • Цель развертывания iOS: 4.0.
  • ОС — Snow Leopard OSX 10.6.8 64bit
Неопределенные символы для архитектуры i386:
 "_objc_assign_global", ссылка из:
  [InAppPurchaseManager sharedInAppPurchaseManager] в InAppPurchaseManager.o
  [ThemeManager sharedThemeManager] в ThemeManager.o
  [DownloadUpdatesManager sharedDownloadUpdatesManager] в DownloadUpdatesManager.o
  [AudioManager sharedAudioManager] в AudioManager.o
  [IOHelper sharedIOHelper] в IOHelper.o
 -[CKBezierPath svgStringPath] в CKBezierPath.o
  [PreferencesManager defaultLineWidth] в PreferencesManager.o
...
 "_objc_assign_ivar", ссылка из:
 -[InAppPurchaseManager init] в InAppPurchaseManager.o
 -[InAppPurchaseManager addTransactionObserver:] в InAppPurchaseManager.o
 -[InAppPurchaseManager removePurchaseTransactionObserver:] в InAppPurchaseManager.o
 -[InAppPurchaseManager purchaseProduct:forThemeIDType:] в InAppPurchaseManager.o
 -[InAppPurchaseManager productsRequest:didReceiveResponse:] в InAppPurchaseManager.o
 -[ThemeEditVC viewDidLoad] в ThemeEditVC.o
 -[ThemeEditVC setDelegate:] в файле ThemeEditVC.o
...
 "_objc_assign_strongCast", ссылка из:
  [SFHFKeychainUtils getPasswordForUsername:andServiceName:ошибка:] в SFHFKeychainUtils.o
  [SFHFKeychainUtils storeUsername:и пароль:forServiceName:updateExisting:ошибка:] в SFHFKeychainUtils.o
  [SFHFKeychainUtils deleteItemForUsername:andServiceName:ошибка:] в SFHFKeychainUtils.o
 __replaceplaceholderswithзначения в утилите.o
 -[LocationManager checkForNewLocation:] в LocationManager.o
 -[LocationManager getNewLocationInStringFormat] в LocationManager.o
 ___52-[LocationManager getNewLocationInStringFormat]_block_invoke_0 в LocationManager.o
...
ld: символ (ы) не найден для архитектуры i386

Редактировать:

Для сборки мусора Objective-C было установлено значение «Поддерживается», а не «Требуется». После установки значения «Требуется» я получил сообщение об ошибке:

ld: /Users/teacher/drawingapp/FlurryLib/libFlurryAnalytics.a(FlurryAnalytics.o) построен с несовместимыми настройками сборки мусора для связи с предыдущими. o файлы для архитектуры i386 Command /Developer_4_2_ios5/Platforms/iPhoneSimulator.platform/Developer/usr/bin / clang завершились ошибкой с кодом выхода 1

После удаления библиотеки Flurry снова начали появляться предыдущие сообщения об ошибках.

Редактировать 2:

Похоже, сборка мусора поддерживается только для OS X, а не для iOS. Я до сих пор не понимаю, почему это позволило бы мне скомпилировать и запустить приложение на устройстве с включенной сборкой мусора, но не на симуляторе.

В любом случае я только что установил сбор мусора на «Неподдерживаемый», но теперь он больше не будет компилироваться и запускаться на устройстве.

Теперь я получаю эту ошибку:

/Users/teacher/drawingapp/Main/Source/PurchaseThemeOptionVC.m 
1. /Users/teacher/drawingapp/Main/Source/PurchaseThemeOptionVC.m:52:1: токен текущего анализатора '-'
2. /Users/teacher/drawingapp/Main/Source/PurchaseThemeOptionVC.m:39:1: LLVM IR генерация объявления 'PurchaseThemeOptionVC::viewDidLoad'
3. /Users/teacher/drawingapp/Main/Source/PurchaseThemeOptionVC.m:39:21: LLVM IR генерация составного оператора ('{}')
clang: ошибка: невозможно выполнить команду: ошибка сегментации
clang: ошибка: команда интерфейса clang не удалась из-за сигнала 2 (используйте -v, чтобы увидеть вызов)

Ответ №1:

Компилятор должен ссылаться на эти функции только в том случае, если вы включили сборку мусора. Вы уверены, что эти объектные файлы не были скомпилированы с включенной сборкой мусора?

Комментарии:

1. Для сборки мусора было просто установлено значение «Поддерживается». Теперь я установил для него значение «Требуется», но все еще имею те же ошибки компоновщика.

2. Сборка мусора в iOS не поддерживается. Вам нужно полностью отключить его.

3. Вы уверены? Он отлично компилируется для устройства, если установлено значение «Поддерживается» или «Требуется». Когда я устанавливаю для него значение «Неподдерживаемый», я получаю странные ошибки компиляции, такие как «LLVM IR generation составного оператора (‘{}’)», и это относится как к симулятору, так и к устройству.

4. Расширенное руководство по программированию управления памятью : «Если вы планируете писать код для iOS, вы должны использовать явное управление памятью».

5. Вы говорите, что он компилируется нормально, но компоновщик сообщает вам, что символы, связанные со сборкой мусора, не могут быть разрешены.

Ответ №2:

Компилятор должен ссылаться на эти функции только в том случае, если вы включили сборку мусора

Не забывайте, что будут ссылки на _objc_assign_global/ivar/strongCast символы, если вы ссылаетесь на библиотеки, скомпилированные с включенной сборкой мусора.