Nach dem Update auf Xcode 5 - ld: Symbol (e) für Architekturarmv7- oder Armv7s-Linkerfehler nicht gefunden

69

Ich habe gerade meine iPhone 4S-Software auf iOS 7 Beta 2 aktualisiert, als ich gerade den letzten Schliff für eine neue App (Phonegap) gab. Keine gute Idee!

Nachdem dies erledigt war, erkannte Xcode mein iPhone nicht und ich installierte Xcode 5 Beta. Nachdem ich daran herumgebastelt hatte, bekam ich es endlich, um mein Telefon zu erkennen. Das einzige Problem ist jetzt, dass ein Fehler in der verwendeten Architektur vorliegt.

Hier werden die Fehler erzeugt:

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)

Irgendwelche Ideen, wie die Architektur geändert werden sollte, damit sie auf meinem Telefon funktioniert? (Es funktioniert gut auf dem Emulator)

Barney
quelle
Was haben Sie in Ihren Build-Einstellungen -> Architekturen?
Poiuytrez
Ich habe nur eine: $ (ARCHS_STANDARD_32_BIT) und unter gültigen Architekturen habe ich: armv7 und armv7s
Barney

Antworten:

104

Kurze Antwort:

  • Entfernen Sie Build Active Architecture Only (Parameterschlüssel für die Build-Einstellung ist 'ONLY_ACTIVE_ARCH') aus allen Projekterstellungseinstellungen Ihrer statischen Bibliotheken oder überschreiben Sie es mit 'NO' wie im folgenden Screenshot: Überschreiben Sie "Nur aktive Architektur erstellen" in "NEIN" oder löschen Sie den Eintrag vollständig, um auf iOS-Standard zurückzugreifen

Detaillierte Antwort:

Das Problem ist, dass Ihre statische Bibliothek 'libCordova.a', die Sie in Ihrer Haupt-App verknüpfen, nur für eine Architektur kompiliert wird (armv7, aber nicht armv7s).

Sie haben Xcode wahrscheinlich alle empfohlenen Änderungen für Ihr statisches Bibliotheksprojekt ausführen lassen, ohne zu lesen, was diese Änderungen tatsächlich sind. Ich habe mich noch nie darum gekümmert, mir diesen Info-Dialog (Screenshot unten) genauer anzusehen, als ich auf eine neue Version von Xcode umgestiegen bin - bis jetzt. Geben Sie hier die Bildbeschreibung ein

Das Problem besteht darin, dass durch das Ausführen dieser Änderungen beim Debuggen eine neue Funktion namens " Nur aktive Architektur erstellen" aktiviert wird erstellen" (der Parameterschlüssel für die Build-Einstellung lautet "ONLY_ACTIVE_ARCH"). Im Prinzip ist dies eine sehr coole Erweiterung von Xcode, da das Setzen auf YES zu schnelleren Bauzeiten führt, da Xcode nur die Architektur des verbundenen Geräts kompiliert, das Sie derzeit oben ausgewählt haben, wenn Sie auf die Schaltfläche Ausführen klicken.

Wenn Sie diesen neuen Parameter jedoch blind in einer statischen Bibliothek akzeptieren, kann dieser Fehler auftreten. Der Fehler tritt auf, wenn Sie die Debug-Version einer statischen Bibliothek erstellt haben, während Sie ein armv7-Gerät angeschlossen haben, und wenn Sie dann Ihre Hauptanwendung debuggen, haben Sie ein armv7s-Gerät angeschlossen (oder umgekehrt). Anschließend erhalten Sie den obigen Fehler (oder einen ähnlichen).

Daher empfehle ich, den Wert auf Projektebene für Build Active Architecture Only vollständig aus allen Projekterstellungseinstellungen Ihrer statischen Bibliotheken zu entfernen . Denn wenn Sie sich die iOS-Standardeinstellungen ansehen, ist dies NEIN. Natürlich können Sie die Einstellung auch auf 'NEIN' überschreiben, um sicherzustellen, dass die Einstellung auch dann korrekt ist, wenn sich der Standardwert in Zukunft ändert (vgl. 1. Screenshot).

Tafkadasoh
quelle
Hat bei mir nicht funktioniert. Ich bin auf Simulator. Fehlt noch etwas?
Van Du Tran
@Tafkadasoh wissen Sie zufällig, wie Sie diese Warnung in Xcode 5 deaktivieren können (ohne andere Warnungen im Zusammenhang mit dem Quellcode zu deaktivieren)?
user1264176
Eine Klarstellung, die mir bei der Verwendung dieser Informationen geholfen hat: Beachten Sie, dass Sie die vorgeschlagene Änderung an Ihrem CordovaLib.xcodeproj-Ziel (ich verwende PhoneGap 2.9) und nicht nur an Ihrem PhoneGap-App-Ziel vornehmen müssen. Wenn Sie es im CordovaLib-Ziel nicht ändern, erzwingt selbst ein Clean / Build nicht, dass libCordova.a mit den richtigen Architekturen erstellt wird.
JA_251
Ich fand diese Antwort, nachdem ich im Wesentlichen dasselbe herausgefunden hatte (danke, dass Sie bestätigt haben, was ich für die richtige Lösung hielt!). Leider macht es keinen Unterschied und ich bekomme immer noch viele Fehler. (Dies alles ging für mich nach Süden, nachdem ich versucht hatte, arm64 zum Mix hinzuzufügen und es dann wieder zu ändern.)
Joe D'Andrea
1
@rkaartikeyan Wählen Sie einfach die entsprechende Zeile in Ihren Projekteinstellungen aus (vgl. 1. Screenshot) und drücken Sie die Rücktaste.
Tafkadasoh
75

Wenn Ihr Projekt mit Cordova 2.x und Xcode 4.x erstellt wurde und Sie den vom OP erwähnten Fehler erhalten, hat diese Lösung für mich funktioniert. (Ich hatte den Fehler mit Cordova 2.5 und Xcode 5).

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

Gehen Sie zu Ihrem Cordova-Projekt

Stammordner -> CordovaLib -> Klicken Sie mit der rechten Maustaste auf CordovaLib.xcodeproj -> Paketinhalt anzeigen -> Öffnen Sie project.pbxproj

Ersetzen Sie alle Vorkommen von (ich hatte 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 */
};

Mit diesem

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 */
};

Jetzt wird Ihr Projekt gut gebaut!

njtman
quelle
Arbeitete perfekt für mich mit Cordova 2.7 und XCode 5.
Dave Reynolds
4
Die Lösung von Tafkadasoh hat bei mir nicht funktioniert. Das funktioniert perfekt! Vielen Dank.
JP Richardson
Hat mit einem Cordova 2.6-Projekt hervorragend für mich funktioniert. Ich bin überrascht, dass der Eintrag "iphoneos7. *" Nicht über die xcode-Benutzeroberfläche erfolgen kann ...
plang
Dies scheint bei Cordova 3.1
Ghigo
@ Ghigo Wie meine Antwort besagt, ist diese Lösung nur für Cordova 2.x. Diese Einstellungen sollten in Cordova 3.x bereits mehr oder weniger vorhanden sein, da iOS7 von Anfang an unterstützt wurde.
NJTMAN
13

Ich habe armv7saus valid architecturesAbschnitt entfernt und es hat bei mir funktioniert.

Build-Einstellungen -> Architekturen -> Gültige Architekturen

Xcode Build-Einstellungen

Harikrishnan
quelle
1
Ich habe auf Xcode 5.1 aktualisiert (das gleichzeitig mit iOS 7.1 herauskommt). Ich habe alle gültigen Architekturen außer armv7 armv7s entfernt. Dann kompiliert und erstellt meine Phonegap-App.
Thomas - BeeDesk
@ Thomas-BeeDesk: Aber hast du eine Idee was passiert das? In gewisser Weise lassen wir die Unterstützung für Build64-Bit-Binärdateien fallen und es werden jetzt nur 32 Binärdateien generiert? Irgendwelche Gedanken ... und wenn die Bibliothek 64-Bit nicht unterstützt, warum gab es keinen Fehler, als ich sie auf xcode 5.0 und ios 7.0 auf einem 64-Bit-Gerät ausführte?
Ankit
@ankit, ich glaube, dass alle CPUs im iPhone (bisher) abwärtskompatibel sind. Der Code in libCordova.awird nur mit 32-Bit-Anweisungen ausgeführt. Die Hauptbestandteile unserer App sollten ohnehin JavaScript sein, das in einer nativen UIWebView ausgeführt wird. Ich denke nicht, dass dies wirklich wichtig ist oder erhebliche Auswirkungen auf die Leistung haben würde.
Thomas - BeeDesk
11

Ich verwende Xcode 5, also iOS SDK 7. Die Lösung, die für mich funktioniert hat, bestand einfach darin, die arm64-Architektur zu entfernen.

Wählen Sie das Projektziel (NICHT CordovaLib.xcodeproj) aus und entfernen Sie in den Build-Einstellungen> Gültige Architekturen arm64, falls es in der Liste vorhanden ist. Hier ist meine, nachdem ich die arm64-Architektur entfernt habe.

Geben Sie hier die Bildbeschreibung ein

Malloc
quelle
4

Weil meine lib.a nur für armv7 ist

Was ich getan habe war

Nur aktive Architektur = ja

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

es wurde gut gebaut und archiviert

ich hoffe es hilft

ruzticgirlz
quelle
1
Ich glaube, Sie können Ihr Projekt einfach bereinigen. Dadurch wird die Bibliothek neu erstellt und für das aktuell angeschlossene Gerät kompiliert. Das Flag "Aktive Architektur erstellen" sollte nicht geändert werden müssen. Dadurch werden beim Debuggen nur unnötig lange Build-Zeiten benötigt. Dies sollte Fehler beseitigen, wenn sie beim Debuggen auf verschiedenen Gerätetypen bereitgestellt werden. Um Ihr Projekt in xcode zu bereinigen, gehen Sie zu Produkt-> Bereinigen. (Oder Befehl + Shift + K)
NJTMAN
lieber njtman, ja du hast recht, nur sauberes projekt es ist arbeitssuche für das angeschlossene gerät. Aber für mich muss ich das Projekt für nicht angeschlossene Geräte archivieren. aber wo ich es archiviere ... das problem ist immer noch da. Also versuche ich dieses und es funktioniert für mich zu finden :). Übrigens, Danke für deinen Tipp.
Ruzticgirlz
@ hypery2k woher weißt du, dass deine lib.a nur für armv7 ist?
Juni Wang
3

njtman hatte eine richtige Antwort. Ich habe nicht den Repräsentanten, um einen Kommentar abzugeben, daher füge ich weitere Details hinzu.

Sie benötigen ein iOS 7 SDK, um die Standardarchitekturen (armv7, armv7s) verwenden zu können.

Mein Projekt war standardmäßig (armv7), ohne armv7s.

Um dies zu beheben, öffnen Sie CordovaLib.xcodeproj unter Build-Einstellungen (eines der Menüs in der oberen Reihe, zentrierte Ausrichtung). Fügen Sie unter Architekturen, Architekturen, Debuggen und Freigeben iOS 7.0 mit Standardarchitekturen hinzu.

njfrost
quelle
0

In den Build-Einstellungen ...

Strip Debug Symbols During  Copy: 

Debug: No

Release: No
Cam Tullos
quelle