Undefinierte Symbole für Architektur armv7

307

Dieses Problem hat mich verrückt gemacht und ich kann nicht herausfinden, wie ich es beheben kann ...

    Undefined symbols for architecture armv7:
  "_deflateEnd", referenced from:
      -[ASIDataCompressor closeStream] in ASIDataCompressor.o
  "_OBJC_CLASS_$_ASIDataDecompressor", referenced from:
      objc-class-ref in ASIHTTPRequest.o
  "_deflate", referenced from:
      -[ASIDataCompressor compressBytes:length:error:shouldFinish:] in ASIDataCompressor.o
  "_deflateInit2_", referenced from:
      -[ASIDataCompressor setupStream] in ASIDataCompressor.o
ld: symbol(s) not found for architecture armv7
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

Ich denke, das hat zu tun mit:

ld: symbol(s) not found for architecture armv7

Aber ich habe hinzugefügt: libz.1.2.3.dylibund es hilft nicht, hat jemand irgendwelche Ideen?

Alex Trott
quelle
Eine andere Möglichkeit, die in keiner der vorhandenen Antworten behandelt wird, besteht darin, dass Sie möglicherweise das -ObjCandere Linker-Flag verwenden und daher Obj-C aus externen statischen Bibliotheken, die Sie verwenden und die nicht sichtbar sein sollten (z. B. aus Parse), sichtbar sind. Siehe meine Antwort, wenn dies der Fall ist: stackoverflow.com/a/26151208/901641
ArtOfWarfare
2
Als Faustregel gilt, dass XCode manchmal Fehler wie Match-O und Symbol angibt, die für die Architektur i386 (oder andere) nicht gefunden wurden, wenn dem Projekt keine Dateien hinzugefügt wurden. Sie können mit der rechten Maustaste auf den Projektordner klicken und "Datei zu <Projekt> hinzufügen" ausführen.
Fabricio PH
Sie können die mit dem nm-Werkzeug generierten konkreten Symbole sehen. Terminal zum Pfad der .o-Dateien und führen Sie nm -gdie Datei aus, die das Symbol aufruft , und die Datei, die das Symbol enthalten soll. Sie sollten dann prüfen, ob sie übereinstimmen oder nicht, was Hinweise auf den Fehler liefern kann. nm -g file.o Sie können die damit entwirrten C ++ - Symbole überprüfen: nm -gC file.o
james_alvarez
Kann mir hier bitte jemand helfen? Ich erhalte den folgenden Fehler, aber keine der oben genannten Lösungen funktioniert für mich. Ich habe bereits Tage mit allen möglichen Einstellungen verbracht. Undefined symbols for architecture armv7: "YGConfig::YGConfig(int (*)(YGConfig*, YGNode*, YGLogLevel, char const*, void*))", referenced from: _YGConfigNew in libyoga.a(Yoga.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
Roter Teufel

Antworten:

506

Häufige Ursachen

Die häufigsten Ursachen für "Undefinierte Symbole für Architektur armv7" sind:

  1. Sie importieren einen Header und verknüpfen ihn nicht mit der richtigen Bibliothek . Dies ist insbesondere bei Headern für Bibliotheken wie QuartzCore üblich, da diese standardmäßig nicht in Projekten enthalten sind. Lösen:

    • Fügen Sie die richtigen Bibliotheken im Link Binary With LibrariesAbschnitt des hinzu Build Phases.

    • Wenn Sie eine Bibliothek außerhalb des Standardsuchpfads hinzufügen möchten, können Sie den Pfad in den Library Search PathsWert in den Build-Einstellungen aufnehmen und dem Abschnitt von hinzufügen
      -l{library_name_without_lib_and_suffix}(z. B. für libz.a -lz) .Other Linker FlagsBuild Settings

  2. Sie kopieren Dateien in Ihr Projekt, haben jedoch vergessen, das Ziel zu überprüfen, zu dem die Dateien hinzugefügt werden sollen . Lösen:

    • Öffnen Sie das Build Phasesfür das richtige Ziel, erweitern Sie es Compile Sourcesund fügen Sie die fehlenden .mDateien hinzu. Wenn dies Ihr Problem ist, stimmen Sie bitte auch der Antwort von Cortex unten zu.

  3. Sie enthalten eine statische Bibliothek, die für eine andere Architektur wie i386, den Simulator auf Ihrem Host-Computer, erstellt wurde. Lösen:

    • Wenn Sie mehrere Bibliotheksdateien von Ihrem Bibliotheksanbieter in das Projekt aufnehmen möchten, müssen Sie die für den Simulator (i386) und die für das Gerät (z. B. armv7) hinzufügen.

    • Optional können Sie eine fette statische Bibliothek erstellen , die beide Architekturen enthält.



Ursprüngliche Antwort:

Sie haben nicht mit der richtigen libz-Datei verlinkt. Wenn Sie mit der rechten Maustaste auf die Datei klicken und sie im Finder anzeigen, sollte sich ihr Pfad irgendwo in einem iOS-SDK-Ordner befinden. Hier ist meine zum Beispiel

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib

Ich empfehle, die Referenz zu entfernen und sie dann wieder im Abschnitt "Binär mit Bibliotheken verknüpfen" wieder hinzuzufügen. Erstellen Sie Phasen Ihres Ziels.

Joe
quelle
4
Dies kann auch daran liegen, dass Sie das Wort "-licucore" in den Projekteinstellungen / Other Linker Flags hinzufügen müssen. Es wurde automatisch für meinen Debug-Build hinzugefügt, aber nicht für die Release-Version, sodass es nicht kompiliert werden konnte.
JulianB
4
Ich hatte das gleiche Problem. Ich habe die Installationshinweise nicht richtig gelesen und daher nicht bemerkt, dass für die neue Version von Bugsense in den Erstellungsphasen libz-Binärdateien hinzugefügt werden müssen.
Max MacLeod
2
Sind Sie sicher, dass Sie für alle Klassen, die Sie in Ihrer Header-Datei deklariert haben, einen Abschnitt @implementation in Ihre jeweilige .m-Datei aufgenommen haben?
Slcott
7
Ich möchte nur hinzufügen, ich denke, es war wirklich respektvoll von Ihnen, eine andere Antwort auf diese Frage zu verweisen und uns zu sagen, dass wir darüber abstimmen sollen, wenn dies hilfreich ist.
Andrew
Danke für die Hilfe! :) Für mich hat das explizite Eingeben im Abschnitt Andere Linker-Flags geholfen : -framework <FrameWorkName>. Ich hatte ein Problem mit XCTest, also musste ich hinzufügen -framework XCTest. Vielen Dank! :)
piotr_ch
198

Ich hatte letzte Nacht ein ähnliches Problem und das Problem hing damit zusammen, dass ich eine Klasse aus dem Finder in mein Projekt in Xcode gezogen hatte.

Die Lösung bestand darin, auf der Registerkarte "Phasen erstellen" und dann auf "Quellen kompilieren" die Klasse in die Liste zu ziehen.

Kortex
quelle
6
Ich wünschte, ich hätte erkannt, dass dies die Antwort war, nach der ich früher gesucht habe. Alternativ können Sie beim Kopieren von Klassen die Option "Zu Zielen hinzufügen" aktivieren.
T. Markle
1
Whoa ... so froh, dass die Lösung so einfach war! Wenn Sie eine Klasse hinzufügen, indem Sie sie aus dem Finder in Ihr Projekt ziehen, fügt XCode sie anscheinend nicht immer Ihrer Liste der Erstellungsphasen hinzu. Ich habe einfach die "+" - Schaltfläche in "Quellen kompilieren" in den Erstellungsphasen gedrückt, alle fehlerhaften Dateien hinzugefügt und sie sofort kompiliert.
Amos
1
Beeindruckend. Apple muss seine Fehlermeldungen wirklich überdenken.
Devios1
2
Eine andere Möglichkeit, dies zu beheben, besteht darin, eine Datei auszuwählen, die angeblich fehlt. und öffnen Sie die Auszugsleiste "Dienstprogramme". (Das ist ganz rechts) Und wählen Sie den "File Inspector". Stellen Sie dann sicher, dass das Projekt unter "Zielmitgliedschaft" überprüft wird. Ich benutze Xcode 4.6.2
Zingle-Dingle
1
Ich wusste nicht, welche Datei fehlte, deshalb habe ich die Build-Phasen im Assistenten-Editor (der zweiten Bearbeitungsansicht) angezeigt. Ich habe die fehlerhafte Datei in der linken Bearbeitungsansicht geöffnet und überprüft, ob jede der importierten Dateien in Build-Phasen vorhanden ist. Ich fügte den hinzu, der dies nicht tat, und es wurde gelöst.
Dan Sandland
38

Ich hatte ein ähnliches Problem und musste in jeder Projektkonfiguration (Debug, Release und Bereitstellung) und in den Build-Einstellungen des Ziels "Nur aktive Architektur erstellen" aktivieren.

Alex Zavatone
quelle
3
Hat auch den Trick für mich gemacht. Wurde aber nur im Hauptprojekt benötigt.
Kirualex
4
Ich stoße auf die gleichen Probleme. Die Build Active Architecture OnlyEinstellungen unterscheiden sich zwischen Podsund meinem Projekt. In der Verbindungsphase ist dies fehlgeschlagen.
AechoLiu
21

Eine weitere mögliche Ursache für Linkerfehler mit "undefiniertem Symbol" ist der Versuch, eine C-Funktion aus einer .mm-Datei aufzurufen. In diesem Fall müssen Sie beim Importieren der Header-Dateien extern "C" {...} verwenden.

Linker-Fehler beim Aufrufen der C-Funktion aus Objective-C ++

user2166865
quelle
14

Ich hatte ein ähnliches Problem damit. Der Klassenname nach _OBJC_CLASS _ $ _ war eigentlich meine Klasse. Der Grund war, dass ich beim Ziehen der Quellcodedateien in die Navigationsliste nicht "Zum Ziel hinzufügen" angekreuzt habe.

Meine Lösung war:

  1. Löschen Sie die Klasse aus der Navigationsliste und wählen Sie "Nur Referenz entfernen".

  2. Ziehen Sie die Quellcodedateien erneut und stellen Sie sicher, dass das Kontrollkästchen für "Zum Ziel hinzufügen" aktiviert ist. Das Kontrollkästchen befindet sich direkt unter "Bei Bedarf kopieren" und "Gruppe erstellen".

Syoleen
quelle
Nur um hinzuzufügen: Obwohl dies NICHT DIE HÄUFIGSTE URSACHE des Fehlers ist, passiert mir jetzt nur Ihre Antwort (hat das Kästchen nicht angekreuzt).
Adam
8

Normalerweise gibt es einen Alias ​​ohne Versionskennung, der mit der aktuellen Version verknüpft ist. In diesem Fall ist libz.dylib mit libz.1.2.5.dylib verknüpft. Verwenden Sie den Basisalias anstelle des versionierten.

zaph
quelle
5

Unter Ziel -> Build-Einstellungen -> Apple LLVM-Compilersprache: Wenn Sie "C ++ - Sprachdialekt" und "C ++ - Standardbibliothek" auf "Compiler-Standard" setzen, kann dies behoben werden.

user1368045
quelle
5

Ich habe meinem Projekt nur die libz.1.2.5.dylib hinzugefügt und es hat wie ein Zauber funktioniert.

Schritte -

  1. Gehen Sie zu Phasen erstellen.
  2. Binär mit Bibliothek verknüpfen - Verwenden Sie die Schaltfläche '+', um Frameworks und Bibliotheken zum Hinzufügen auszuwählen.
  3. Wählen Sie libz.1.2.5.dylib aus der Liste aus.
  4. Bauen und ausführen.
girish_vr
quelle
5

Ich hatte ein ähnliches Problem und sah Fehler im Zusammenhang mit "std ::"

Ich habe die Build-Einstellungen geändert -> Apple LVM 5.0 - Sprache C ++ -> C ++ Standard Library

von libc ++ (LLVM C ++ Standardbibliothek mit C ++ 11-Unterstützung) bis libstdc ++ (GNU C ++ Standardbibliothek)

Andrew Soltan
quelle
5

Ich hatte das gleiche Problem, als ich die Admob-Bibliothek verwendete. Ich habe das Problem behoben, indem ich "Architekturen" in "Standardarchitekturen armv7, armv7s" ohne 64-Bit geändert habe. Build-Einstellungen

pabloverd
quelle
4

Ich habe mehrere @ Interfaces in der .h-Datei und habe noch nicht alle entsprechenden @ Implementierungsanweisungen aufgenommen. Stellen Sie sicher, dass alle ausgeglichen sind.

James
quelle
4

Wenn Sie das Flag -ObjCunter "Ziel"> "Build-Einstellungen"> "Andere Linker-Flags" haben und dieses Problem auftritt, sollten Sie es entfernen. Wenn Sie es absichtlich hinzugefügt haben, weil Sie einen Obj-C-Code aus einer statischen Bibliothek laden müssen, die sonst normalerweise nicht geladen würde, IE, eine Obj-C-Kategorie, sollten Sie -force_load <path>stattdessen verwenden -ObjC.

<path>sollte relativ zu Ihrem Xcode-Projektverzeichnis sein. IE, wenn Ihre Verzeichnisstruktur so aussieht:

iOSProject
  + iOSAPI.framework
      + iOSAPI
  + iOSAPI.xcodeproj

Dann sollten Sie dieses Flag setzen für Other Linker Flags:

-force_load iOSAPI.framework/iOSAPI

Wenn Sie mehrere solcher Bibliotheken einschließen möchten, sollten Sie -force_loadfür jede eine separate Zeile einfügen.

-force_load iOSAPI.framework/iOSAPI
-force_load another.framework/another
ArtOfWarfare
quelle
4

So habe ich dieses Problem bekommen:

Ich habe eine .h, .m und NIB aus einem anderen Projekt hinzugefügt, indem ich sie auf meinen Projektnavigator gezogen habe. Xcode hat sie nicht ordnungsgemäß zu den Build-Phasen hinzugefügt.

Überprüfen Sie meine Antwort, da ich ein ähnliches Problem hatte, das ich durch einige Schritte lösen konnte.

Himanshu Agnihotri
quelle
3

Wenn Sie mit dem iOS5-Upgrade zu tun haben, habe ich festgestellt, dass ich zum Kompilieren eines auf Ziel 4.3 geschriebenen Projekts libz.1.2.3.dynlib im Projektnavigator einfach in libz.1.2.5.dynlib umbenennen und kompilieren kann.

Mein iPhoneOS50SDK / usr / lib-Ordner hat keine libz.1.2.3.dynlib - ich weiß nicht, ob es sich um eine Beta-Sache oder nur um ein natürliches Upgrade handelt.

Stan
quelle
3

Gehen Sie zu Ihrem Projekt, klicken Sie auf Phasen erstellen, Quellen kompilieren, GameCenterManager.m zur Liste hinzufügen.

Dhaval Sarvaiya
quelle
3

Wahrscheinlich fehlen einige Klassen in Ihrem Ziel. Dies geschieht normalerweise, wenn Sie Ihrem Projekt neue Klassendateien umbenennen / entfernen / hinzufügen. Um dies zu beheben, fügen Sie die neu hinzugefügten Klassen einigen Zielen hinzu.

Wählen Sie die Klasse im Projektnavigator (rechte Seitenleiste) aus, öffnen Sie die Seitenleiste Dienstprogramme (rechte Seitenleiste), wählen Sie in den Dienstprogrammen den Dateiinspektor (dateiähnliches Symbol) aus, und aktivieren Sie auf der Registerkarte Zielmitgliedschaft Ihre Ziele. Dies ist alles, um den "Verweis entfernen" zu vermeiden und erneut hinzuzufügen, indem Sie den Trick "Zu Zielen hinzufügen" ankreuzen.

Also: Wählen Sie Klasse -> Dienstprogramme (Dateiinspektor) -> Zielmitgliedschaft -> Kreuzen Sie die gewünschten Ziele an.

andrei
quelle
2

Ich habe diesen Vorschlag hier nicht gefunden, also hier ist es: Wenn Ihr Projekt mehr als ein Ziel hat (dh eines für OSX und eines für iOS), müssen Sie die relevanten Bibliotheken für jedes Ziel verknüpfen . So zum Beispiel in meinem Fall ich brauchte AudioToolbox .. Ich musste es einmal für OSX und einmal für iOS hinzufügen (unter dem Framework- Ordner müssen Sie ein Duplikat jeder Bibliothek für jedes Ziel haben .. wenn Sie nur eine sehen .. dann ist das eine rote Fahne)

Abbood
quelle
Diese Antwort hat mir geholfen. Meine Situation war jedoch noch einfacher ... Ich habe einfach vergessen, ein Framework hinzuzufügen, auf das meine Codebasis verweist. In meinem Fall konnte ich AVFoundation.framework nicht laden.
John Erck
Ja, ich habe einfach vergessen, ein Framework in der Phase "Binär mit Bibliotheken verknüpfen" hinzuzufügen.
Max
2

Ich hatte ein Problem mit PJSIP-Bibliotheken.

Versuchte Folgendes in anderen Linker-Flags im Projekt und konnte den Fehler beheben: -framework Foundation -framework UIKit

Die oben genannten Linker-Flags werden in Siphone Project über Github verwendet . Diese Einstellungen helfen Ihnen bei der Lösung von Problemen im Zusammenhang mit der Verknüpfung von C ++ - Bibliotheken.

Adeesh Jain
quelle
Ich habe das gleiche Problem mit PJSIP-Bibliotheken. Können Sie die Lösung im Detail erklären
Rajat Jain
Setzen Sie die folgenden Werte in anderen Linker-Flags der Projekterstellungseinstellung: -framework Foundation -framework UIKit
Adeesh Jain
Fehlermeldung: Ignoriert die Datei /Users/user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a. Die Datei wurde für ein Archiv erstellt, bei dem es sich nicht um die zu verknüpfende Architektur handelt (i386): / Users /user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a Undefinierte Symbole für die Architektur i386: "_pjsip_register_method", referenziert von:
Rajat Jain
Anscheinend versuchen Sie, die App auf dem Simulator auszuführen, und libyuv.a wurde nicht für die Simulatorarchitektur i386 entwickelt. Versuchen Sie, die App direkt auf dem Gerät
auszuführen
Ich möchte Pjsip in Swift integrieren. Ich habe versucht, Bridging-Header zu erstellen, aber es hat nicht funktioniert. Kannst du mir eine Idee geben?
Rajat Jain
1

Schließlich habe ich es herausgefunden, ich habe dieses Problem gelöst, indem ich target-> Build Phases-> Link Binary With Libraries ein fehlendes Framework hinzugefügt habe

lomec
quelle
1

Ich hatte einmal dieses Problem. Mir wurde klar, dass ich beim Verschieben einer Klasse die .mmDatei mit der .hDatei im Zielordner überschrieben hatte .

Durch Beheben dieses Problems wurde der Fehler behoben.

user2158690
quelle
1

Beim Versuch, ein Projekt zu kompilieren, bei dem die Zielerstellungseinstellung für 'C ++ Standard Library' auf 'libc ++' gesetzt war (erforderlich, da das Projekt einige Funktionen aus C ++ 11 verwendete), wurde der Fehler 'Undefinierte Symbole für Architektur armv7:' angezeigt Das Projekt enthielt ein Unterprojekt, für das dieselbe Einstellung auf 'libstdc ++' festgelegt war (oder der Compiler-Standard wie derzeit).

Durch Ändern der Einstellung 'C ++ Standard Library' des Unterprojekts in libc ++ wurde das Problem behoben, jedoch erst, nachdem das Bereitstellungsziel für das Unterprojekt zuerst auf 5.0 oder höher festgelegt wurde (5.0 ist für libc ++ erforderlich).

Si.
quelle
1

Ich gebe Ihnen weitere Vorschläge, die Sie überprüfen können, wenn andere häufig verwendete Vorschläge nicht hilfreich sind.

Wenn Sie mit einem anderen Projekt (libxxx.a) verknüpfen, kann es manchmal zu einem seltsamen Problem kommen, bei dem Sie das Symbol mit Werkzeugen wie nm finden, die Symbole in ld jedoch nicht finden können. Anschließend sollten Sie überprüfen, ob die beiden Projekte in denselben Flags erstellt wurden. Einige davon können sich auf das Binärformat auswirken.

  1. Überprüfen Sie den C ++ - Compiler.
  2. Überprüfen Sie die C ++ - Dialekteinstellung.
  3. Überprüfen Sie die Unterstützung des C ++ - Laufzeittyps. (-frtti / -fnortti)
  4. Überprüfen Sie, ob an anderer Stelle .a mit demselben Namen angezeigt wird, das möglicherweise über der gewünschten Datei in der Linkpfadliste liegt. entferne sie.
Fluke
quelle
1

Ich habe dieses Problem beim Ausführen der App auf dem iPhone5s erhalten . Es wurde durch Hinzufügen von arm64 zu Architectures behoben .

alexqinbj
quelle
1

Ich hatte das gleiche Problem. Ich habe alles aus der riesigen Liste der Antworten ausprobiert, aber am Ende war mein Problem: Ich arbeite mit openCV, also muss ich C ++ - Code in meinem Code kombinieren. Dazu sollten Sie die Dateien, die Objective-C und C ++ verwenden, in .mm ändern. Ich habe keine Datei geändert und diese Datei hat keine Verbindung zum C ++ - Code, musste sie jedoch ändern.

user2743760
quelle
1

Ich hatte dieses Problem bei der Installation von shareKit. Es funktionierte im Simulator, aber nicht auf dem Gerät. Ich habe -all_load vom Other Linker Flag entfernt und alles funktioniert sowohl im Simulator als auch auf dem iPhone-Gerät einwandfrei.

Jordanien
quelle
1

In meinem Fall habe ich ein Framework hinzugefügt, das Objective C ++ verwenden muss. Ich habe diesen Beitrag gefunden:

XCode .m vs. .mm

das erklärte, wie main.m in main.mm umbenannt werden musste, damit auch die Objective-C ++ - Klassen kompiliert werden konnten.

Das hat es für mich behoben.

Vito Andolini
quelle
1

Ich stelle mich diesem Problem, wenn sich das Modul (Datei .m) nicht in dem Ziel befindet, mit dem ich arbeite.

Javier Calatrava Llavería
quelle
1

Für mich war das Problem, dass ich vergessen habe , den Wert für meine Konstanten in der .m (Implementierung) festzulegen.

file const kFooKey = @"Foo";
Jakub Truhlář
quelle
1

Ich habe auch Dateien durch Ziehen und Ablegen hinzugefügt. Was ich getan habe, habe ich Verweise auf alle Dateien entfernt (ausgenommen frameworks) und sie dann wieder ordnungsgemäß über die Option Dateien zum Projekt hinzufügen hinzugefügt. Das Problem ist behoben.

Vaibhav Saran
quelle
1

Wenn Sie aus Unity3D 5 erstellen und auch ein Prime31-Plugin verwenden und diesen Fehler erhalten, liegt dies wahrscheinlich an einer doppelten DLL. Wenn Sie Ihre Warnungen im Unity-Editor durchsehen, wird Ihnen einer von ihnen dies mitteilen und warnen, dass dies zu Build-Fehlern führen kann. Um festzustellen, ob dies der Fall ist, geben Sie P31 in Ihr Projektsuchfeld ein und es sollte sofort angezeigt werden, möglicherweise sogar mehr als eines. Die Duplikate haben am Ende des Dateinamens eine '1'. Dies ist wahrscheinlich darauf zurückzuführen, dass der Plugin-Editor über den Store oder die Registerkarte Prime31-Menü aktualisiert wurde.

Dela Torre
quelle