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

Ошибка компоновщика Xcode 6 - Undefined символы для архитектуры armv7

После перехода на Xcode 6 beta 7 (и теперь все еще с Xcode 6 GM) я не могу связать свое приложение Swift. Я получаю такие ошибки, как:

Undefined символы для архитектуры armv7:    "_swift_stdlib_compareNSStringDeterministicUnicodeCollation", на который ссылаются:

...

ld: символ не найден для архитектуры armv7 clang: ошибка: команда компоновщика не сработала с кодом выхода 1 (используйте -v для вызова вызова)

Я видел другие сообщения SO, которые рекомендуют удалять папку Derived Data и/или использовать опцию Clean Build Folder, чтобы пройти эту ошибку, но это решение вообще не помогло мне в этом случае. Ничего не изменилось в отношении моего кода или CocoaPods, которые я использую с Xcode 6 beta 5, который в последний раз работал.

Любые идеи?

EDIT:

Полная запись журнала ошибок:

Undefined символы для архитектуры arm64:    "_swift_stdlib_compareNSStringDeterministicUnicodeCollation", на который ссылаются:        TFC12MyProject21BarcodeViewController13captureOutputfS0_FTGSQCSo15AVCaptureOutput_24didOutputMetadataObjectsGSQGSaPSs9AnyObject ___ 14fromConnectionGSQCSo19AVCaptureConnection__T_ в BarcodeViewController.o   Msgstr "#:.        TFC12MyProject27SessionsTableViewController17viewWillDisappearfS0_FSbT_ в SessionsTableViewController.o   Msgstr "" ".       __TFC12MyProject7RestApi12tokenMappingfS0_FT_CSo15RKEntityMapping в RestApi.o       __TFC12MyProject28AttendeesTableViewControllerg24fetchedResultsControllerCSo26NSFetchedResultsController в AttendeesTableViewController.o       __TFC12MyProject27SessionsTableViewControllerg24fetchedResultsControllerCSo26NSFetchedResultsController в SessionsTableViewController.o       __TFC12MyProject21BarcodeViewController13startScanningfS0_FT_Sb в BarcodeViewController.o   Msgstr " "".       __TFC12MyProject7RestApi12resetRestKitfS0_FT_T_ в RestApi.o       __TFC12MyProject16BluetoothManager17_startAdvertisingfS0_FT_T_ в BluetoothManager.o       __TFC12MyProject19LoginViewController32registerForKeyboardNotificationsfS0_FT_T_ в LoginViewController.o       __TFC12MyProject19LoginViewController35deregisterFromKeyboardNotificationsfS0_FT_T_ в LoginViewController.o       __TFC12MyProject19LoginViewController16callProcessLoginfS0_FT_T_ в LoginViewController.o       __TFC12MyProject21CheckinViewController16enableBeaconModefS0_FT_T_ в CheckinViewController.o       __TFC12MyProject21BarcodeViewController13startScanningfS0_FT_Sb в BarcodeViewController.o       ... ld: символ не найден для архитектуры arm64 clang: ошибка: команда компоновщика не сработала с кодом выхода 1 (используйте -v для вызова вызова)

4b9b3361

Ответ 1

То, что происходит здесь, не имеет ничего общего с местоположением Derived Data.

Когда быстрое приложение построено, оно проходит несколько этапов:

  • Записать вспомогательные файлы

  • Создание структуры продукта

  • Скомпилируйте быстрый источник для каждой архитектуры

  • Скопируйте правила ресурсов ресурсов

  • Скопировать заголовок приложения

  • Ссылка на быстрые библиотеки времени выполнения для каждой архитектуры

  • Скопировать оперативный модуль приложения для каждой архитектуры

  • Создать двоичный файл приложения

  • Фаза сборки ресурсов копирования

  • Скопируйте быстрые стандартные библиотеки в приложение

  • Упакуйте его

  • Подпишите его

Уф! Это много. Ваша сборка не работает при связывании с быстрыми библиотеками времени выполнения. Они живут в Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos внутри каталога разработчика Xcode. В частности, библиотека, которая не связана правильно, libswiftCore.dylib. Если вы используете nm в этой библиотеке, вы можете увидеть, что он определяет ваш первый отсутствующий символ:

quellish% nm /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos/libswiftCore.dylib | grep compareNSStringDeterministicUnicodeCollation
00197c8c T _swift_stdlib_compareNSStringDeterministicUnicodeCollation
000000000018352c T _swift_stdlib_compareNSStringDeterministicUnicodeCollation

Вы также можете использовать lipo, чтобы узнать, какие архитектуры находятся в файле:

quellish% xcrun lipo -info /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos/libswiftCore.dylib
Architectures in the fat file: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos/libswiftCore.dylib are: armv7 arm64

Он содержит armv7 и arm64. Это не проблема архитектуры библиотеки.

Связывание с быстрой стандартной библиотекой не работает. Возможно, что управление исходным кодом или перенос версий Xcode заставило ваш файл проекта отбросить часть шага связывания или просто не смог найти библиотеки, с которыми ему нужно связать. Файлы проекта Xcode сложны и используют множество ссылок - возможно, что слияние и т.д. Вызвало критическую ссылку, которая должна быть отделена от этапа связывания. Без полного журнала сборки и просмотра вашей машины это может быть невозможно сказать.

Эта библиотека, как вы могли догадаться, не имеет ничего общего с местоположением данных, полученными из проекта.

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

Я бы посоветовал вам записать ошибку и включить в нее неприятный файл проекта.

Ответ 2

Я решил проблему, удалив все данные в папке ~/Library/Developer/Xcode/DerivedData. Я читал об этом в другом потоке, но проигнорировал это, думая, что в чистом включен этот процесс!

Ответ 3

Я обновил Yosemite, Xcode 6.1. Я обновил gem xcodeproj (0.19.4) и cocoapods (0.34.4).

Я разрешаю свой конфликт:

Очистка папки Library/Developer/Xcode/DerivedData​​p >

заменить в Target → Настройки сборки → Связывание → Другие флаги компоновщика: $(OTHER_LDFLAGS)

Проверка цели → Сборка фаз → Копирование ресурсов Pods: "$ {SRCROOT}/Pods/Файлы поддержки /Pods/Pods -resources.sh"

Ответ 4

1) Я сталкиваюсь с той же проблемой, но просто очищаю приложения от полученных данных от User/Library/Developer/Xcode/DerivedData, и я могу запустить код.

2) В вашем случае это может быть выполнено путем удаления архитектуры armv7 из настроек сборки. И убедитесь, что ваш компилятор является компилятором по умолчанию в настройках сборки.

Спасибо, я надеюсь, что это поможет вам и всем.

Ответ 5

Это, по-видимому, вызвано (для большинства) путем связывания сторонней библиотеки, которая не поддерживает запрошенную архитектуру.

Ответ 6

У меня была схожая проблема (ошибка компоновщика из фреймворка Apple). Как оказалось, проблема заключалась в том, что я отсутствовал в библиотеке LocalAuthentication.framework. Мне интересно, возможно, вам нужно удалить Foundation.framework со вкладки "Фаза сборки" (в разделе "Библиотеки ссылок" ), а затем повторно добавить его? Может быть, это решит проблему?

Ответ 7

"Модернизировано" на xcode 6, а быстрое приложение не будет создавать для симулятора, но все равно построит на iPad-Linker ошибку, undefined символы для i386 для симулятора.

Для меня работала очистка папки Library/Developer/Xcode/DerivedData.

Ответ 8

В Xcode 6.0.1 появляется ошибка, которая заставляет компоновщик отбрасывать зависимости в существующих файлах проекта. У меня была такая же проблема в нескольких разных проектах, новых и старых, начиная с обновления 6.0.1.

Легкое "исправление" - просто уничтожить все "Derrived Data" и все файлы сборки (т.е. вручную очистить проект), а затем перестроить после нового перезапуска Xcode. Волшебным образом, компоновщик теперь находит все недостающие архитектуры/символы.

ПРИМЕЧАНИЕ. У меня было несколько несовместимых сбоев v-table, вызванных этой же ошибкой. Компилятор С++, по-видимому, генерирует неполные связи, вызывая абсурдные ошибки, когда реальных ошибок не обнаружено. Опять же, просто перестройтесь из чистого состояния и.. та да... спасите себя от головокружения и потратите время на отслеживание без проблем.

Ответ 9

Я решил эту проблему, пробовав все, что было предложено здесь, без везения. Как и раньше, это проблема с SourceControl.

В обозревателе проекта отсутствует один из моих файлов проекта (тот, который указан в сообщении об ошибке). Тем не менее, XCode все еще имел ссылку на него (я перешел к определению класса, когда я выбирал "переход к определению" из графического интерфейса Xcode).

На самом деле project.pbxproj не перечислял его. Вероятно, это проблема Git. В любом случае, я просто воссоздал файл в том же каталоге, в котором он был воссоздан, и вуаля.

Ответ 10

Я есмь, когда дело доходит до iOS Objective C, хотя я уже много лет кодирую несколько других языков. Поэтому я часто ношу в темноте с помощью Objective C.

Я начал эту ошибку: "Undefined символы для архитектуры armv7", сразу после объявления некоторых "глобальных" переменных в моем .h файле следующим образом:

extern NSString *globalNotes;
extern NSString *globalUserCountry;

Затем я ссылался на эти переменные из файла .m так:

globalNotes= @"Error (Marker 1010)";
globalUserCountry= @"No result";

THE FIX - Чтобы исправить это, я поменял их на свойства объектов следующим образом:

@property(nonatomic, strong, readwrite) NSString *globalNotes;
@property(nonatomic, strong, readwrite) NSString *globalUserCountry;

И назвали их так:

self.globalNotes= @"Error (Marker 1010)";
self.globalUserCountry= @"No result";

Это, похоже, исправить мою проблему.