След актуализация до 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)

Някакви идеи за това на какво трябва да се промени архитектурата, за да може да работи на моя телефон? (работи добре на емулатора)


person barney    schedule 26.06.2013    source източник
comment
Какво имате във вашите Настройки за изграждане -› Архитектури?   -  person poiuytrez    schedule 26.06.2013
comment
Имам само един: $(ARCHS_STANDARD_32_BIT) и при валидни архитектури имам: armv7 и armv7s   -  person barney    schedule 26.06.2013


Отговори (7)


Кратък отговор:

  • Премахнете Само изграждане на активна архитектура (ключът на параметъра за настройка на компилацията е „ONLY_ACTIVE_ARCH“) от всичките ви настройки за компилиране на проект на статични библиотеки или го презапишете с „НЕ“, както е на екранната снимка по-долу: Заменете „Само изграждане на активна архитектура“ на „НЕ“ или изтрийте напълно записа му, за да се върнете към iOS по подразбиране“></li>
</ul>

<p><strong>Подробен отговор:</strong></p>

<p>Проблемът е, че вашата статична библиотека „libCordova.a“, която свързвате в основното си приложение, е компилирана само за една архитектура (armv7, но не и armv7s).</p>

<p>Вероятно сте позволили на Xcode да извърши всички препоръчани промени за вашия проект за статични библиотеки, без да прочетете какви всъщност са тези промени.  Говорейки за себе си, никога не съм си правил труда да разгледам по-отблизо този диалогов прозорец с информация (екранна снимка по-долу), когато преминах към нова версия на Xcode - до сега.  <img src=

    Проблемът е, че извършването на тези промени активира за компилации за отстраняване на грешки нова функция, наречена Само изграждане на активна архитектура (ключът на параметъра за настройка на компилацията е „ONLY_ACTIVE_ARCH“). По принцип това е много страхотно подобрение на Xcode, защото настройката на това на YES води до по-бързо време за изграждане, тъй като Xcode компилира само архитектурата на свързаното устройство, което сте избрали в момента в горната част, когато натиснете бутона за изпълнение.

    Въпреки това, когато приемате сляпо този нов параметър в статична библиотека, може да попаднете на този бъг. Грешката възниква, когато сте изградили версията за отстраняване на грешки на статична библиотека, докато сте свързали armv7 устройство, и след това, когато отстранявате грешки в основното си приложение, сте свързали armv7s устройство (или обратното). Впоследствие ще получите грешката по-горе (или подобна).

    Така че моята препоръка е да премахнете напълно стойността на ниво проект за Само изграждане на активна архитектура от всички настройки за изграждане на проекти на вашите статични библиотеки. Защото, ако погледнете настройките по подразбиране на iOS, това е НЕ. Разбира се, можете също да презапишете настройката на „НЕ“, за да сте сигурни, че настройката е правилна, дори ако в бъдеще стойността по подразбиране ще се промени (вж. 1-ва екранна снимка).

    person Tafkadasoh    schedule 26.06.2013
    comment
    Не ми подейства. На симулатор съм. Липсва ли нещо друго? - person Van Du Tran; 13.09.2013
    comment
    @Tafkadasoh случайно знаеш ли как да деактивираш това предупреждение в Xcode 5 (Без деактивиране на други предупреждения, свързани с изходния код)? - person user1264176; 23.09.2013
    comment
    Пояснение, което ми помогна да използвам тази информация: Имайте предвид, че трябва да направите предложената промяна във вашата цел CordovaLib.xcodeproj (използвам PhoneGap 2.9), а не само целта на вашето приложение PhoneGap. Ако не го промените в целта CordovaLib, дори clean/build няма да принуди libCordova.a да бъде изграден с правилните архитектури. - person JA_251; 26.09.2013
    comment
    Намерих този отговор, след като разбрах по същество същото (благодаря ви, че потвърдихте това, което смятах за правилното решение!). Уви, това не прави разлика и все още получавам много грешки. (Всичко това тръгна на юг за мен, след като се опитах да добавя arm64 към микса, след което го промених обратно.) - person Joe D'Andrea; 27.09.2013
    comment
    Сблъсках се с този проблем, използвайки Cordova 3.0 и XCode 5. Тази корекция работи прекрасно! - person David Myers; 01.10.2013
    comment
    Вярвам, че можете просто да изчистите проекта си и това ще наложи повторно изграждане на библиотеката и ще я компилира за текущо свързаното устройство. Не би трябвало да има нужда да променяте флага за изграждане на активна архитектура, като направите това просто ще доведе до ненужно дълги времена за изграждане при отстраняване на грешки. За да почистите проекта си в xcode, отидете на Product-›Clean. (Или команда + shift + K) - person njtman; 02.10.2013
    comment
    @rkaartikeyan Просто изберете съответния ред в настройките на вашия проект (вж. 1-ва екранна снимка) и натиснете клавиша Backspace. - person Tafkadasoh; 25.10.2013
    comment
    Благодаря ви. Спря да работи изведнъж. Отне ми часове, за да го разбера. Това е полезно - person Gowthami Gattineni; 30.01.2014
    comment
    Това реши и моя проблем. Беше в CordovaLib, където трябваше да го задам на No. - person islanddave; 15.10.2014

Ако вашият проект е създаден с помощта на 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 */
};

Сега вашият проект ще се изгради добре!

person njtman    schedule 19.09.2013
comment
Работи перфектно за мен с Cordova 2.7 и XCode 5. - person Dave Reynolds; 28.09.2013
comment
Решението от Tafkadasoh не работи за мен. Това работи перфектно! Благодаря. - person JP Richardson; 29.09.2013
comment
Работи чудесно за мен, с проект Cordova 2.6. Изненадан съм, че записът в iphoneos7.* не може да бъде направен през потребителския интерфейс на xcode... - person plang; 03.10.2013
comment
Това изглежда вече не е така с Cordova 3.1 - person Ghigo; 10.10.2013
comment
@Ghigo Както гласи отговорът ми, това решение е само за Cordova 2.x. Тези настройки повече или по-малко трябва да съществуват в Cordova 3.x, тъй като поддържа iOS7 от самото начало. - person njtman; 10.10.2013
comment
Работи перфектно за мен! Благодаря - person Tomjr260; 14.10.2013
comment
Влязох в настройките за изграждане на Cordova lib и промених падащото меню Архитектури, за да използвам стандартни архитектури. Вярвам, че това е еквивалентно - основно добавяне на armv7s компилация към списъка. - person jocull; 20.10.2013
comment
можеш ли да разясниш това? Опитах се да следвам описанието ви в xcode, но се изгубих. @jocull - person njtman; 11.11.2013
comment
Когато щракнете върху проекта, има раздел, наречен Настройки за изграждане - трябва да можете да го намерите там. - person jocull; 11.11.2013
comment
да Съгласен съм. Това оправи проблема ми. Благодаря. - person Gilad M; 15.11.2013
comment
Работи за мен с Cordova 3.4.0 и XCode 5.1, въпреки че нямах настройки на ARCHS в моите 2 конфигурации, преди да добавя тези, които препоръчахте. Много благодаря! - person Brad Griffith; 19.03.2014

Премахнах armv7s от раздела valid architectures и при мен проработи.

Настройки за изграждане --> Архитектури --> Валидни архитектури

Настройки за изграждане на Xcode

person Harikrishnan    schedule 24.10.2013
comment
Актуализирах до Xcode 5.1 (които излизат едновременно с iOS 7.1). Приключих с премахването на всички валидни архитектури освен armv7 armv7s. След това моето приложение phonegap се компилира и изгражда. - person Thomas - BeeDesk; 13.03.2014
comment
@Thomas-BeeDesk: Но имате ли представа какво се случва това? по някакъв начин премахваме поддръжката за build64 bit binary и сега ще се генерират само 32 binary? някакви мисли...и ако библиотеката не поддържа 64 бита, защо няма грешка, когато я стартирам на xcode 5.0 и ios 7.0 на 64 битово устройство? - person Ankit; 13.03.2014
comment
@ankit, вярвам, че всички процесори в iPhone са обратно съвместими (засега). Кодът в libCordova.a ще работи само с 32-битови инструкции. По-голямата част от нашето приложение така или иначе трябва да се изпълнява с JavaScript в собствен UIWebView, не мисля, че това наистина има значение или би имало значително въздействие върху ефективността. - person Thomas - BeeDesk; 14.03.2014

Използвам Xcode 5, така че iOS SDK 7. Решението, което работи за мен, беше просто да премахна архитектурата arm64.

Изберете целта на проекта (НЕ CordovaLib.xcodeproj) и в настройките за изграждане>Валидни архитектури премахнете arm64, ако е там в списъка. Ето моя, след като премахнах arm64 архитектурата.

въведете описание на изображението тук

person Malloc    schedule 23.03.2014

Тъй като моята lib.a е само за armv7

това, което направих беше

Само активна архитектура = да

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

беше изграден и архивиран добре

надявам се да помогне

person ruzticgirlz    schedule 08.10.2013
comment
Вярвам, че можете просто да изчистите проекта си и това ще наложи повторно изграждане на библиотеката и ще я компилира за текущо свързаното устройство. Не би трябвало да има нужда да променяте флага за изграждане на активна архитектура, като направите това просто ще доведе до ненужно дълги времена за изграждане при отстраняване на грешки. Това трябва да елиминира грешки при разгръщане на различни типове устройства при отстраняване на грешки. За да почистите проекта си в xcode, отидете на Product-›Clean. (Или команда + shift + K) - person njtman; 08.10.2013
comment
скъпи njtman, да, прав си, просто изчисти проекта, това е работно намиране за свързаното устройство. Но за мен трябва да архивирам проекта за несвързано устройство. но когато го архивирам ... проблемът все още е там. Така че пробвам този и той работи за намиране за мен :). между другото, благодаря за съвета. - person ruzticgirlz; 09.10.2013
comment
@hypery2k откъде знаеш, че твоят lib.a е само за armv7? - person June Wang; 11.03.2019

njtman имаше правилен отговор. Нямам представител, който да коментира, затова добавям повече подробности.

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

Моят проект беше по подразбиране (armv7), без да включва armv7s.

За да поправите това, отворете CordovaLib.xcodeproj, под Настройки за изграждане (едно от менютата в горния ред, центрирано подравняване) Под архитектури, Архитектури, отстраняване на грешки и издание, ДОБАВЕТЕ iOS 7.0, използвайки стандартни архитектури.

person njfrost    schedule 04.10.2013

В настройките на компилацията...

Strip Debug Symbols During  Copy: 

Debug: No

Release: No
person Cam Tullos    schedule 09.10.2013