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

XCode 6.1 Отсутствует требуемая архитектура X86_64 в файле

В XCode 6.1 я получаю сообщение об ошибке для iPhone 6, iPhone 5s (iOS 7.1), в котором говорится

    Undefined symbols for architecture x86_64:
      "_OBJC_CLASS_$_ClientAuthenticator", referenced from:
      objc-class-ref in AppDelegate.o
ld: symbol(s) not found for architecture x86_64
linker command failed with exit code 1

Это то, что у меня есть для перспективы настройки архитектуры

  Architectures : Standard Architectures(armv7, arm64) - $(ARCHES_STANDARD)
  Base SDK : Latest iOS(8.1) 
  Valid Architectures: arm64, armv7, armv7s

  IOS Deployment Target: iOS 6.0

Недавно я обновил свою ОС до Yosemite и XCode с 6.0 до 6.1. Я искал в Stackoverflow для этого вопроса, который относится к XCode 5.1 и пробовал все данные решения, но ничего не сработало.

Обновление. Я попробовал изменения, как было предложено в ответе, но я все равно продолжаю получать сообщение об ошибке " Отсутствует требуемая архитектура X86_64". Что касается дальнейшего расследования, я обнаружил, что файл ClientAuthenticator.o, который из моей библиотеки, не создается для архитектуры X86_64 и, вероятно, это проблема? Я смотрю, как он может быть создан для x86_64.

Мой новый вопрос в чем разница между arm64 и x86_64? Больше похоже на разницу между производителем архитектуры, но базовая 64-битная архитектура остается той же.

4b9b3361

Ответ 1

  • Прежде всего вам следует убедиться, что ваша статическая библиотека имеет все архитектуры. Когда вы выполняете lipo -info myStaticLibrary.a на терминале - вы должны увидеть архитектуры armv7 armv7s i386 x86_64 arm64 для вашего живого двоичного файла.

  • Для этого я предполагаю, что вы делаете универсальный двоичный файл - добавьте следующие параметры вашей архитектуры в проект статической библиотеки -

enter image description here

  • Итак, вы можете увидеть, что мне нужно вручную установить Standard architectures (including 64-bit) (armv7, armv7s, arm64) проекта статической библиотеки.

enter image description here

  • В качестве альтернативы, поскольку обычный $ARCHS_STANDARD теперь включает 64-разрядный. Вы также можете сделать $(ARCHS_STANDARD) и armv7s. Проверьте lipo -info без него, и вы выясните недостающие архитектуры. Здесь снимок экрана для всех архитектур -

enter image description here

  • Для вашей ссылочной реализации (проект с использованием статической библиотеки). Настройки по умолчанию должны работать нормально -

    enter image description here

Обновление 12/03/14 Xcode 6 Стандартные архитектуры исключают armv7s.

Итак, armv7s не нужен? Да. Похоже, что общие различия между наборами команд armv7 и armv7s незначительны. Поэтому, если вы решите не включать armv7s, целевой код машины armv7 по-прежнему отлично работает на 32-битных устройствах A6, и вряд ли можно заметить разрыв в производительности. Источник

Если есть более разумный способ для Xcode 6.1+ (iOS 8.1 и выше) - пожалуйста, поделитесь.

Ответ 2

Если вы создаете универсальную библиотеку и вам необходимо поддерживать Simulator (x86_64), тогда создайте фреймворк для всех платформ, установив Build Active Architecture Only в No. enter image description here

Ответ 3

Многие используют скрипты сборки, найденные здесь: http://www.raywenderlich.com/41377/creating-a-static-library-in-ios-tutorial или здесь: https://gist.github.com/sponno/7228256 для их запуска script в своей цели.

Я вытаскивал свои волосы, пытаясь добавить x86_64, i386, armv7s, armv7 и arm64 в раздел "Архитектуры", только чтобы найти lipo -info targetname.a никогда не возвращать эти архитектуры после успешной сборки.

В моем случае мне пришлось изменить целевой скрипт, особенно шаг 1, из gist-ссылки, чтобы вручную включить архитектуры с использованием -arch.

Step 1. Build Device and Simulator versions xcodebuild -target ${PROJECT_NAME} ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" xcodebuild -target ${PROJECT_NAME} -configuration ${CONFIGURATION} -sdk iphonesimulator -arch x86_64 -arch i386 -arch armv7 -arch armv7s -arch arm64 BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"

Ответ 4

Вот ответ на ваш последний вопрос о различии между x86_64 и arm64:

  • Для запуска 64-битного симулятора требуется архитектура
  • x86_64.

    Для работы 64-битного устройства требуется архитектура
  • arm64 (iPhone 5s, iPhone 6, iPhone 6 Plus, iPad Air, iPad mini с сетчаткой дисплей).

Ответ 5

Я столкнулся с точно такой же проблемой и следил за этим учебным пособием https://github.com/jverkoey/iOS-Framework#faq

Как я сделал эту работу, после того, как вы вставляете скрипты в свою фазу сборки, прежде чем компилировать, убедитесь, что вы скомпилируете ее с помощью симулятора iphone (я использовал iPhone6) вместо IOS-устройства.

который даст мне 2 среза: armv7 и x86_64, а затем перетащите его в новый проект, который отлично работает для меня.

Ответ 6

После изменений вы должны сделать это (измените архитектуру на armv7 и удалите другие): -

Изменить, что вы должны сделать

Ответ 7

Еще одна вещь, которая стоит обратить внимание на то, что XCode плохо обрабатывает импорт библиотеки, и во многих случаях решение заключается в поиске импортированного файла в вашем проекте, удалении его в Finder или из командной строки и добавлении его обратно, иначе он не будет правильно обновлен XCode. XCode оставляет там старый файл, который вы продолжаете работать в кругах, не понимая, почему он не компилируется, отсутствует архитектура и т.д.

Ответ 8

Мое решение было подключить мой iPhone 6, построить его, и я успешно выполнил проект.

Потому что я строю для iPhone 6 Simulator.