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-битная архитектура остается той же.
Ответы
Ответ 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]()
Обновление 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.