После обновления до Xcode 5 - ld: символы (символы) не найдены для архитектуры armv7 или armer7s ошибка компоновщика

Я только что обновил свое программное обеспечение iPhone 4S до iOS 7 Beta 2, пока я был посредине окончательного прикосновения к новому приложению (Phonegap).. не очень хорошая идея!

После того, как это было сделано, Xcode не обнаружил мой iPhone, поэтому я установил бета-версию Xcode 5. После возиться с ним я, наконец, получил его, чтобы обнаружить мой телефон. Единственная проблема теперь - это ошибка с используемой архитектурой.

Вот создаваемые ошибки:

ld: warning: ignoring file /Users/-----------/Library/Developer/Xcode/DerivedData/testtest-bmnbmujiosugcmgeiceofgcfmsec/Build/Products/Debug-iphoneos/libCordova.a, file was built for archive which is not the architecture being linked (armv7s): /Users/--------/Library/Developer/Xcode/DerivedData/testtest-bmnbmujiosugcmgeiceofgcfmsec/Build/Products/Debug-iphoneos/libCordova.a
Undefined symbols for architecture armv7s:
  "_OBJC_METACLASS_$_CDVCommandDelegateImpl", referenced from:
      _OBJC_METACLASS_$_MainCommandDelegate in MainViewController.o
  "_CDVLocalNotification", referenced from:
      -[AppDelegate application:didReceiveLocalNotification:] in AppDelegate.o
  "_OBJC_CLASS_$_CDVCommandDelegateImpl", referenced from:
      _OBJC_CLASS_$_MainCommandDelegate in MainViewController.o
  "_OBJC_CLASS_$_CDVCommandQueue", referenced from:
      _OBJC_CLASS_$_MainCommandQueue in MainViewController.o
  "_OBJC_METACLASS_$_CDVViewController", referenced from:
      _OBJC_METACLASS_$_MainViewController in MainViewController.o
  "_OBJC_METACLASS_$_CDVCommandQueue", referenced from:
      _OBJC_METACLASS_$_MainCommandQueue in MainViewController.o
  "_CDVPluginHandleOpenURLNotification", referenced from:
      -[AppDelegate application:handleOpenURL:] in AppDelegate.o
  "_OBJC_CLASS_$_CDVViewController", referenced from:
      _OBJC_CLASS_$_MainViewController in MainViewController.o
ld: symbol(s) not found for architecture armv7s
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Любые идеи о том, для чего нужно изменить архитектуру, чтобы заставить ее работать на моем телефоне? (он отлично работает на эмуляторе)

Ответ 1

Короткий ответ:

  • Удалить Только встроенную активную архитектуру (параметр настройки параметра настройки - ONLY_ACTIVE_ARCH) из всех настроек сборки проекта в статических библиотеках или перезаписать его с помощью "НЕТ", как на скриншоте ниже: Overwrite 'Build Active Architecture Only' to 'NO' or delete it's entry completely to fallback to iOS Default

Подробный ответ:

Проблема в том, что ваша статическая библиотека libCordova.a, которую вы связываете в основном приложении, скомпилирована только для одной архитектуры (armv7, но не armv7s).

Вы, вероятно, позволили Xcode выполнить все рекомендуемые изменения для вашего проекта статических библиотек, не прочитав, каковы эти изменения на самом деле. Говоря сам за себя, я никогда не потрудился более подробно рассмотреть этот информационный диалог (снимок экрана ниже), когда я перешел на новую версию Xcode - до сих пор. enter image description here

Проблема заключается в том, что выполнение этих изменений активируется для отладки, создающей новую функцию с именем Только встроенная активная архитектура (ключ параметра настройки установки - "ONLY_ACTIVE_ARCH" ). В принципе, это очень крутое усовершенствование Xcode, потому что установка этого параметра в YES приводит к более быстрому времени построения, поскольку Xcode только компилирует архитектуру подключенного устройства, которое вы выбрали вверху, когда вы нажимаете кнопку запуска.

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

Итак, моя рекомендация - полностью удалить значение на уровне проекта Только встроенная активная архитектура из всех настроек сборки проекта ваших статических библиотек. Потому что, если вы посмотрите на значение iOS по умолчанию, это НЕТ. Конечно, вы также можете переписать настройку на "НЕТ", чтобы убедиться, что настройка правильная, даже если в будущем значение по умолчанию изменится (см. 1-й снимок экрана).

Ответ 2

Если ваш проект был построен с использованием Cordova 2.x и Xcode 4.x, и вы получаете ошибку, упомянутую OP, это решение сработало для меня. (Я столкнулся с ошибкой с Cordova 2.5 и Xcode 5).

https://issues.apache.org/jira/browse/CB-3768

Перейдите к проекту Cordova

Корневая папка → CordovaLib → Щелкните правой кнопкой мыши CordovaLib.xcodeproj → Показать содержимое пакета → Открыть project.pbxproj

Заменить все вхождения (у меня было 4)

buildSettings = {
    ALWAYS_SEARCH_USER_PATHS = NO;//in 2 out of 4 occurrences
    "ARCHS[sdk=iphoneos*]" = armv7;
    "ARCHS[sdk=iphoneos6.*]" = (
        armv7,
        armv7s,
    );
        /* other settings here */
};

С помощью этого

buildSettings = {
    ALWAYS_SEARCH_USER_PATHS = NO;//in 2 out of 4 occurrences
    "ARCHS[sdk=iphoneos*]" = armv7;
    "ARCHS[sdk=iphoneos7.*]" = (
        armv7,
        armv7s,
    );
    "ARCHS[sdk=iphoneos6.*]" = (
        armv7,
        armv7s,
    );
    /* other settings here */
};

Теперь ваш проект будет построен отлично!

Ответ 3

Я удалил раздел armv7s из valid architectures, и он работал у меня.

Настройки сборки → Архитектуры → Допустимые архитектуры

Xcode Build Settings

Ответ 4

Я использую Xcode 5, поэтому iOS SDK 7. Решение, которое работало для меня, было просто удалить архитектуру arm64.

Выберите цель проекта (NOT CordovaLib.xcodeproj) и в настройках сборки > Допустимые архитектуры, удалите arm64, если она есть в списке. Вот мой вопрос после удаления архитектуры arm64.

enter image description here

Ответ 5

Потому что мой lib.a предназначен только для armv7

что я сделал, было

Только активная архитектура = да

buildSettings = {
                ALWAYS_SEARCH_USER_PATHS = NO;
                "ARCHS[sdk=iphoneos*]" = (
                    armv7s,
                    armv7,
                );
                "ARCHS[sdk=iphoneos6.*]" = (
                    armv7s,
                    armv7,
                );
                "ARCHS[sdk=iphoneos7.*]" = (
                    armv7,
                    armv7s,
                );

он был построен и архивирован отлично

надеюсь, что это поможет

Ответ 6

njtman имел правильный ответ. У меня нет комментариев для комментариев, поэтому я добавляю более подробную информацию.

Вам нужен iOS 7 SDK для использования стандартных архитектур (armv7, armv7s).

Мой проект по умолчанию не выполнял (armv7), не включая armv7s.

Чтобы исправить это, Open CordovaLib.xcodeproj, В разделе "Настройки сборки" (одно из меню в верхней строке, центрированное выравнивание) В архитектуре, архитектуре, отладке и выпуске ADD iOS 7.0 используются стандартные архитектуры.

Ответ 7

В настройках сборки...

Strip Debug Symbols During  Copy: 

Debug: No

Release: No