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.dylib
und es hilft nicht, hat jemand irgendwelche Ideen?
-ObjC
andere 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/901641nm -g
die 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.oUndefined 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)
Antworten:
Häufige Ursachen
Die häufigsten Ursachen für "Undefinierte Symbole für Architektur armv7" sind:
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 Libraries
Abschnitt des hinzuBuild Phases
.Wenn Sie eine Bibliothek außerhalb des Standardsuchpfads hinzufügen möchten, können Sie den Pfad in den
Library Search Paths
Wert 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 Flags
Build Settings
Sie kopieren Dateien in Ihr Projekt, haben jedoch vergessen, das Ziel zu überprüfen, zu dem die Dateien hinzugefügt werden sollen . Lösen:
Build Phases
für das richtige Ziel, erweitern Sie esCompile Sources
und fügen Sie die fehlenden.m
Dateien hinzu. Wenn dies Ihr Problem ist, stimmen Sie bitte auch der Antwort von Cortex unten zu.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
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.
quelle
-framework <FrameWorkName>
. Ich hatte ein Problem mit XCTest, also musste ich hinzufügen-framework XCTest
. Vielen Dank! :)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.
quelle
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.
quelle
Build Active Architecture Only
Einstellungen unterscheiden sich zwischenPods
und meinem Projekt. In der Verbindungsphase ist dies fehlgeschlagen.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 ++
quelle
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:
Löschen Sie die Klasse aus der Navigationsliste und wählen Sie "Nur Referenz entfernen".
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".
quelle
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.
quelle
Unter Ziel -> Build-Einstellungen -> Apple LLVM-Compilersprache: Wenn Sie "C ++ - Sprachdialekt" und "C ++ - Standardbibliothek" auf "Compiler-Standard" setzen, kann dies behoben werden.
quelle
Ich habe meinem Projekt nur die libz.1.2.5.dylib hinzugefügt und es hat wie ein Zauber funktioniert.
Schritte -
quelle
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)
quelle
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.
quelle
Ich habe mehrere @ Interfaces in der .h-Datei und habe noch nicht alle entsprechenden @ Implementierungsanweisungen aufgenommen. Stellen Sie sicher, dass alle ausgeglichen sind.
quelle
Wenn Sie das Flag
-ObjC
unter "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:Dann sollten Sie dieses Flag setzen für
Other Linker Flags
:Wenn Sie mehrere solcher Bibliotheken einschließen möchten, sollten Sie
-force_load
für jede eine separate Zeile einfügen.quelle
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.
quelle
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.
quelle
Gehen Sie zu Ihrem Projekt, klicken Sie auf Phasen erstellen, Quellen kompilieren, GameCenterManager.m zur Liste hinzufügen.
quelle
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.
quelle
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)
quelle
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.
quelle
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
quelle
Ich hatte einmal dieses Problem. Mir wurde klar, dass ich beim Verschieben einer Klasse die
.mm
Datei mit der.h
Datei im Zielordner überschrieben hatte .Durch Beheben dieses Problems wurde der Fehler behoben.
quelle
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).
quelle
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.
quelle
Ich habe dieses Problem beim Ausführen der App auf dem iPhone5s erhalten . Es wurde durch Hinzufügen von arm64 zu Architectures behoben .
quelle
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.
quelle
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.
quelle
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.
quelle
Ich stelle mich diesem Problem, wenn sich das Modul (Datei .m) nicht in dem Ziel befindet, mit dem ich arbeite.
quelle
Für mich war das Problem, dass ich vergessen habe , den Wert für meine Konstanten in der .m (Implementierung) festzulegen.
quelle
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.quelle
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.
quelle