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


Я только что обновил свое программное обеспечение 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)

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

7 69

7 ответов:

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

  • удалить Построение Архитектуры Active Только (ключ параметра настройки сборки- "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 (или наоборот). Впоследствии вы получите ошибку выше (или аналогичную).

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

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

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

перейти к вашему проекту Кордова

Корневая Папка - > CordovaLib - > Щелкните Правой Кнопкой Мыши CordovaLib.xcodeproj - > показать содержимое пакета - > открыть проект.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 */
};

теперь ваш проект будет строить хорошо!

у меня удалены armv7s с valid architectures раздел и это сработало для меня.

Параметры --> Архитектура --> Действительный Архитектур

Xcode Build Settings

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

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

enter image description here

потому что мой lib.a только для armv7

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

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

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

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

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

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

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

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

исправить это, Откройте Проект Cordovalib.xcodeproj файл, В настройки сборки (одно из меню в верхней строке, выравнивание по центру) В разделе архитектуры, архитектуры, отладка и выпуск добавьте iOS 7.0, используя стандарт зодчие.

В Настройки Сборки...

Strip Debug Symbols During  Copy: 

Debug: No

Release: No