Undefinierte Symbole für Architektur arm64

200

Jedes Mal, wenn ich eine Datei von CocoaPods importiere, wird ein Apple Mach-O Linker-Fehler angezeigt.

Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_FBSession", referenced from: someFile
ld: symbol(s) not found for architecture arm64

Ich bekomme ungefähr 12 davon für die verschiedenen Pods, die ich benutze.

Ich versuche mit XCode 5 für das iPhone 5S zu bauen.

Ich habe hier auf SO verschiedene Lösungen ausprobiert, aber noch keine zum Laufen gebracht.

Wie behebe ich diesen Apple Mach-O Linker-Fehler?


Ich habe gerade eine weitere Warnung gefunden, die interessant sein könnte. Ich hoffe, dies führt mich zur Lösung:

Ignoring file ~/Library/Developer/Xcode/DerivedData/SomeApp/Build/Products/Debug-iphoneos/libPods.a, 

file was built for archive which is not the architecture being linked (arm64):~/Library/Developer/Xcode/DerivedData/someApp/Build/Products/Debug-iphoneos/libPods.a

GangstaGraham
quelle
Einfache Lösung Gehen Sie zu Ziel -> Verknüpfen -> anderes Linker-Flag und fügen Sie in Debug und Release $ (geerbt) in ein anderes Linker-Flag ein.
Mihir Oza

Antworten:

248

Wenn Ihre Architekturen und gültigen Architekturen in Ordnung sind, können Sie überprüfen, ob Sie andere Linker-Flags wie $(inherited)folgt hinzugefügt haben , wodurch in Pods generierte Linker-Flags hinzugefügt werden : Geben Sie hier die Bildbeschreibung ein

chancyWu
quelle
7
@chancyWu Könnten Sie erklären?
Paul Brewczynski
5
Auch wenn dies immer noch nicht funktioniert, fügen Sie @ (geerbt) zu den Bibliothekssuchpfaden hinzu.
Enrico Susatyo
1
Lol, ignorierte Use the $(inherited) flagTerminalwarnung. Und der Fehler hat mich hierher gebracht. hat meinen Tag gerettet.
Sushil Sharma
2
Ich arbeite mit Xcode 7.2 und in anderen Linker-Flags -> Debug Ich sehe: -weak_framework CoreFoundation -weak_framework UIKit -weak_framework AVFoundation -weak_framework CoreMedia -weak-lSystem -ObjC ... hier habe ich $ (geerbt) hinzugefügt, aber es tut nicht t Arbeit
Alessandra
Du hast mir viel Zeit gespart. Vielen Dank.
Nirmalsinh
123

Das Problem ist, dass die Cocoapods noch nicht für die arm64-Architektur erstellt wurden und daher beim Erstellen nicht verknüpft werden können. Wahrscheinlich können Sie diese Pakete erst verwenden, wenn sie aktualisiert wurden und diese Architektur verwenden. Sie können den Linker-Fehler beheben, indem Sie zu Projekt -> Ziel (Ihr Projektname) -> Einstellungen erstellen und Architekturen in Standardarchitekturen (armv7, armv7s) und gültige Architekturen in armv7, armv7s ändern.

Beachten Sie jedoch, dass Sie nicht die volle Leistung des 64-Bit-Prozessors erhalten. Sie sagten, Sie bauen für die 5er, also kann es einen Grund geben, warum Sie dies brauchen. Wenn Sie aus irgendeinem Grund diese Leistung unbedingt benötigen (vielleicht erstellen Sie gerade ein Spiel) und diese Dateien dringend benötigen, können Sie eine Pull-Anfrage senden und das Projekt dann in arm64 neu kompilieren, indem Sie dieselben Felder in den Dateien, aus denen Sie gezogen haben, auf arm64 setzen die Open Source-Projekte. Aber wenn Sie nicht wirklich brauchen, dass diese Dateien 64-Bit-kompatibel sind, scheint das vorerst ein bisschen übertrieben zu sein.

BEARBEITEN: Einige Leute berichteten auch, dass das Setzen von Build For Active Architectures auf YES ebenfalls erforderlich war, um dieses Problem zu lösen.

Ab dem 28.04.2014 sollte die Einstellung ungefähr so ​​aussehen:

Geben Sie hier die Bildbeschreibung ein

AdamG
quelle
4
Dies löste den Fehler beim Ausführen auf dem Simulator, löste jedoch nicht den Fehler beim Ausführen auf dem Gerät. Pods wurde für libPods.a abgelehnt, weil seine Architekturen '' (aus irgendeinem Grund erkennt es sie nicht - obwohl ich sie in Xcode sehen kann) nicht alle erforderlichen Architekturen 'armv7 armv7s'
enthielten
7
Ok, ich habe dies erreicht, indem ich Build For Active Architectures auf Yes gesetzt habe. Ich danke dir sehr!
GangstaGraham
2
Nebenbei: Mit dem fileBefehl im Terminal können Sie feststellen , welche Architekturen eine statische Bibliothek unterstützt.
Funroll
8
Ich bin gerade hierher gekommen, um den Refrain zu erweitern: Die Auswahl von JA für BUILD FOR ACTIVE ARCHITECTURES ist hier die beste Option.
Wells
56
Dies ist keine Lösung mehr. Apple fordert jetzt Unterstützung für 64-Bit für alle Bereitstellungen.
52

Ich habe dieses Problem gelöst, indem ich Folgendes eingestellt habe:

ARCHS = armv7 armv7s

VALID_ARCHS = armv6 armv7 armv7s arm64

Morisunshine
quelle
1
Ich hatte ein ähnliches Problem, als ich XCode 5.1 zum ersten Mal verwendete. Dadurch wurde es behoben. Vielen Dank!
GangstaGraham
@morisunshine Bist du sicher, hast du die binären Architekturen nach dem Build überprüft?
onmyway133
@ onmyway133 Ich habe überprüft, aber jetzt habe ich dieses Problem im neuen XCode nicht getroffen.
Morisunshine
@ Morisunshine Ja, ich meine, Sie verlieren den Arm64
onmyway133
Keine Buildfehler mehr, bis zu diesem Punkt ist es OK. Aber beim Hochladen des archivierten Builds erhalte ich den Fehler "Arm64-Bit fehlt", da die Unterstützung von Arm64-Bit ein Zwang vom 1. Februar 2015 ist.
Zeeawan
45

Ich bin auf das gleiche / ähnliche Problem bei der Implementierung gestoßenAVPictureInPictureController und das Problem war, dass ich das AVKit- Framework in meinem Projekt nicht verknüpft habe.

Die Fehlermeldung lautete:

Undefined symbols for architecture armv7:
   "_OBJC_CLASS_$_AVPictureInPictureController", referenced from:
       objc-class-ref in yourTarget.a(yourObject.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Die Lösung:

  1. Gehen Sie zu Ihrem Projekt
  2. Wählen Sie Ihr Ziel
  3. Gehen Sie dann zu Phasen erstellen
  4. Öffnen Sie Link Binary With Libraries
  5. Zum Schluss fügen Sie einfach + das hinzu AVKit- Framework / ein anderes Framework hinzu .

Hoffentlich hilft dies jemand anderem, auf ein ähnliches Problem zu stoßen, das ich hatte.

valbu17
quelle
6
Ja, erwähnenswert, dass dies ein Fehler ist, der ausgelöst wird, wenn Sie ein Framework vermissen. Ein Hinweis ist, dass Sie versuchen, Architekturen zu entfernen, und die nächste / verbleibende schlägt ebenfalls fehl ...
Kristen Waite
1
Gut gemacht. `_ _OBJC_CLASS _ $ _ XXXXXClass", referenziert von: `,, add xxx Framework.
iHTCboy
Genau richtig! Jeder, der etwas mit 'xml' gedruckt sieht, checkt dies aus - in meinem Fall war es das 'libxml'-Framework, das nicht verlinkt wurde.
Evusas
Nach dem Ändern der Einführung von pod trat dieser Fehler auf und alle Methoden wurden nicht behoben. Aber Ihre Methode behebt das Problem. Hinweis: lib kann nicht durchsucht werden.
Stern Lee
33

Ich habe auch das gleiche Problem festgestellt, die oben genannten Methoden werden nicht funktionieren. Ich habe versehentlich die Dateien im folgenden Verzeichnis gelöscht.

Ordnerplatzierung:

~ / Library / Developer / Xcode / DerivedData /

Geben Sie hier die Bildbeschreibung ein

ylgwhyh
quelle
3
So seltsam das auch scheinen mag, das hat tatsächlich funktioniert. Danke, Kumpel.
Felipe
2
Das manuelle Löschen abgeleiteter Daten hat auch für mich den Trick getan. Prost!
L_Sonic
7
Danke dir! Ich möchte einen Hinweis hinzufügen: Der Ordner befindet sich unter / Benutzer / Ihr Name / Bibliothek / Entwickler / XCode / DerivedData
Stefano Buora
Sie sollten auch in der Lage sein, abgeleitete Daten über das Terminal zu löschen: rm -rf ~ / Library / Developer / Xcode / DerivedData
simon_smiley
Hat mir Zeit gespart ... XDDD
Hsiao-Ting
25

Setzen Sie Architekturen auf armv7 armv7s , Build Active Architecture Only auf NO für jedes Ziel im Projekt, einschließlich jedes in Pods

BabyPanda
quelle
Hat irgendwie funktioniert ... Jetzt erhalte ich den Fehler "Ungültige Bitcode-Signatur".
JeremyF
18

Ich habe meine behoben, indem ich die ausgewählten Implementierungsdateien in der Zielmitgliedschaft auf der rechten Seite überprüft habe. Dies ist insbesondere beim Umgang mit Erweiterungen, dh benutzerdefinierten Tastaturen, nützlich.

Zielmitgliedschaft

jaytrixz
quelle
Xcode 9 wendet dies nicht automatisch an, selbst wenn das Kontrollkästchen aktiviert ist. Danke dir.
Amro Shafie
Das war das Problem. Vielen Dank
Ignacio Hernández
11

Hier sind einige Erklärungen warum build_active_architecture auf NO gesetzt ist. Xcode erkennt nun, welche Geräte Sie angeschlossen haben, und stellt die aktive Architektur entsprechend ein. Wenn Sie also einen iPod Touch der 2. Generation an Ihren Computer anschließen, sollte Xcode die aktive Architektur auf armv6 setzen. Wenn Sie Ihr Ziel mit der obigen Debug-Konfiguration erstellen, wird jetzt nur die armv6-Binärdatei erstellt, um Zeit zu sparen (es sei denn, Sie haben ein großes Projekt, Sie werden den Unterschied möglicherweise nicht bemerken, aber ich denke, die Sekunden summieren sich im Laufe der Zeit).

Wenn Sie eine Verteilungskonfiguration für die Veröffentlichung im App Store erstellen, sollten Sie sicherstellen, dass diese Option nicht aktiviert ist, damit Xcode stattdessen die fette universelle Binärdatei http://useyourloaf.com/blog/2010/04/21/xcode erstellt -build-active-Architecture-only.html

Moaz Saeed
quelle
Das ist so unglaublich FUBAR! Die Ausgabe von XCode hängt davon ab, welches Gerät Sie an die Build-Maschine angeschlossen haben!
Matt
5

Gelöst nach dem Löschen des Inhalts der DerivedData -> Build -> Produkte -> Debug-iphoneos

Tamir Avrahamov
quelle
5

Sie müssen nur arm64 aus der gültigen Architektur entfernen und NO auf Nur aktive Architektur setzen . Jetzt einfach reinigen, bauen und ausführen. Sie werden diesen Fehler nicht mehr sehen.

:) KP

Kalpesh Panchasara
quelle
4

Dies hängt möglicherweise mit libz.dyliboder zusammen. Sie libz.tbdmüssen es lediglich zu Ihren Zielen für die Verknüpfungsbinärdateien hinzufügen und erneut versuchen, es zu kompilieren.

TonyTony
quelle
Ich habe versucht, das Tesseract-Framework hinzuzufügen, und nur das hat mir geholfen, danke. !
HelloimDarius
3

Ich habe es gelöst, indem ich gültige Bögen auf armv7 armv7s gesetzt und Build-Architekturen in Release nur auf YES gesetzt und dann eine neue "Pod-Installation" über die Befehlszeile durchgeführt habe

Fabio Russo
quelle
3

Angesichts eines iPhone 5s und nachdem ich noch keine 64-Bit-Version einer Drittanbieter-Bibliothek erhalten hatte, musste ich mit dem neuesten Xcode in den 32-Bit-Modus zurückkehren (vor 5.1 hat es sich nicht beschwert).

Ich habe dies behoben, indem ich arm64 aus der Liste der gültigen Architekturen gelöscht und dann Build Active Architecture Only auf NO gesetzt habe. Es scheint mir, dass dies sinnvoller ist als umgekehrt, wie oben gezeigt. Ich poste für den Fall, dass andere Leute keine der oben genannten Lösungen für sie finden könnten.

user938797
quelle
3

Ich hatte das gleiche Problem nach dem Upgrade auf Xcode 5.1 und habe es behoben, indem ich Architectures auf armv7 armv7s gesetzt habe

deko
quelle
3

War den ganzen Tag in dieser Angelegenheit festgefahren.

Ich hatte mehrere Schemata, es wurde gut für Demo, Internal, Release kompiliert - das Debug-Schema wurde jedoch einfach nicht kompiliert und beschwerte sich über das Fehlen von libPods.a.

Die Lösung bestand darin, zu Projekt -> Ziel -> Build-Einstellungen zu wechseln und "Nur aktive Architektur erstellen" in JA zu ändern. Reinigen und bauen! Endlich Stunden Kopfjucken gelöst!

Spieleentwickler
quelle
Nicht genau das gleiche Problem wie Sie, aber ähnlich. Ich habe es mit der gleichen Methode gelöst, die Sie angegeben haben.
Helzgate
2

Einstellen -ObjCauf Other Linker Flagsin Build - Einstellungen des Ziels das Problem gelöst.

Thomas G.
quelle
2

Das hat bei mir funktioniert:

ios sdk 9.3

in Ihre Build-Einstellung von app.xcodeproj gültige Architektur: armv7 armv7s Build Aktive Architektur: Nein

Sauber und bauen, für mich gearbeitet.

Shashank Saxena
quelle
1

Das Folgende hat für mich funktioniert, damit GPUImage ohne Fehler auf Xcode 5.1 sowohl für den 64-Bit-Simulator als auch für das Retina iPad Mini ohne kompiliert werden kann dass arm64 aus der Liste der gültigen Architekturen entfernt werden muss (was den Zweck des Besitzes eines 64-Bit-Geräts zum Testen zunichte macht 64-Bit-Leistung).

Laden Sie den ZIP-Ordner von der GitHub-Seite herunter: https://github.com/BradLarson/GPUImage

Entpacken Sie und navigieren Sie zum Ordner "Framework". Fügen Sie von hier aus den Ordner 'Source' hinzu und kopieren Sie ihn in Ihr Xcode-Projekt. Stellen Sie sicher, dass "Elemente in den Ordner der Zielgruppe kopieren" aktiviert ist und dass "Gruppen für hinzugefügte Ordner erstellen" ebenfalls aktiviert ist. Dadurch werden die generischen Header- / Implementierungsdateien für iOS und Mac in Ihr Projekt kopiert.

Wenn Sie die Mac-Dateien nicht benötigen, weil Sie für iOS kompilieren, können Sie den Mac-Ordner entweder löschen, bevor Sie die Dateien in Ihr Projekt kopieren, oder einfach die Gruppe aus Xcode löschen.

Wenn Sie den Quellordner zu Ihrem Projekt hinzugefügt haben, verwenden Sie einfach die folgenden Schritte, um die Klassen / Methoden von GPUImage zu verwenden:

#import "Source/GPUImage.h" 

Ein paar Dinge, auf die Sie hinweisen sollten:

  • Wenn die Fehlermeldung "Kakao" nicht gefunden wird, haben Sie den Mac-Ordner / die Mac-Header zu Ihrem iOS-Projekt hinzugefügt. Löschen Sie einfach die Mac-Gruppe / -Dateien aus Ihrem Projekt, und die Warnung verschwindet
  • Wenn Sie den Quellordner (nicht die Gruppe in Xcode) umbenennen, verwenden Sie diesen Namen anstelle von "Source / GPUImage.h" in der Anweisung #import. Wenn Sie den Ordner also vor dem Hinzufügen zu Ihrem Projekt in GPUImageFiles umbenennen, verwenden Sie: #import "GPUImageFiles / GPUImage.h
  • Stellen Sie natürlich sicher, dass arm64 in der Liste der gültigen Architekturen ausgewählt ist, um den A7 64-Bit-Prozessor zu nutzen!
  • Dies ist kein GPUImage.framework-Bundle (z. B. wenn Sie das Framework von http://www.raywenderlich.com/60968/ios-7-blur-effects-gpuimage heruntergeladen haben ), daher ist es möglicherweise nicht die richtige Art, GPUImage zu verwenden das hat Brad Larson beabsichtigt, aber es funktioniert für mein aktuelles SpriteKit-Projekt.
  • Es ist nicht erforderlich, eine Verknüpfung zu Frameworks / Bibliotheken usw. herzustellen. Importieren Sie einfach den Header und den Quellordner der Implementierung wie oben beschrieben

Hoffe, dass das oben Genannte hilft - es scheint, dass es nirgendwo klare Anweisungen gab, obwohl die Frage mehrmals gestellt wurde, aber keine Angst, GPUImage funktioniert definitiv für die arm64-Architektur!

unzugänglich
quelle
1

Dieses Problem trat bei mir nach der Installation eines Pods über Podfile und auf pod install. Nachdem ich eine Reihe verschiedener Korrekturen ausprobiert hatte, importierte ich den Pod schließlich einfach manuell (indem ich die erforderlichen Dateien in mein Projekt zog) und das löste das Problem.

Will Dennis
quelle
Das hat auch bei mir funktioniert, war aber ein einfacher Pod mit einer Datei.
iluvatar_GR
1

Als Morisunschein Antwort von in die richtige Richtung zeigte, löste eine kleine Änderung in seiner Antwort mein Problem für iOS8.2. Danke an ihn.

Ich habe dieses Problem gelöst, indem ich Folgendes eingestellt habe:

ARCHS = armv7

VALID_ARCHS = armv6 armv7 armv7s arm64

BUILD ACTIVE ARCHITECTURE ONLY= NO
SandeepAggarwal
quelle
1
  1. Gehen Sie zu den Ziel-Build-Einstellungen.
  2. Setzen Sie BUILD ACTIVE ARCHITECTURE ONLY = NO für Debug und Release
  3. Bauen und ausführen
Zia
quelle
3
Setzen Sie BUILD ACTIVE ARCHITECTURE NUR im PODS-Projekt
Elad
1

In meinem Fall musste ich suchen

C++ Standard Libraryund stellen Sie sicher, dass das libc++ausgewählt wurde.

Etienne Noël
quelle
1

Für mich verwende ich opencv 2.4.9 in xcode 7.2 für iOS und die oben genannten Fehler sind aufgetreten. Ich löse die Fehler, indem ich opencv über die Pod-Installation anstelle des Offline-OpenCV-Frameworks verwende.

Sie können es versuchen, indem Sie den folgenden OpenCV-Pod-Text hinzufügen und das Offline-OpenCV-Framework löschen, falls Sie es verwendet haben.

Pod 'OpenCV', '2.4.9'

Chuyang
quelle
1

Keine der Lösungen behebt diesen Fehler in meinem Fall (Xcode 9) mit TesseractOCRiOS. Nach stundenlangem Ausprobieren fand ich eine gute Lösung. Ich lösche gerade 'pod 'TesseractOCRiOS', '~> 4.0.0'in der Podfile, laufen pod install. Fügen Sie dann pod 'TesseractOCRiOS', '~> 4.0.0'wieder hinzu Podfileund führen Sie es pod installerneut aus.

Knall! Es klappt!

Benjamin Wen
quelle
1

"Das OPN [Debug] -Ziel überschreibt die Build-Einstellung OTHER_LDFLAGS." Dies war das Hauptproblem. Nach dem Hinzufügen von $ (geerbt) in einer neuen Zeile in anderen Linker-Flags wurde mein Problem behoben. Geben Sie hier die Bildbeschreibung ein

Mohsen Mokhtari
quelle
1

In einigen Fällen trat dieser Fehler auf, wenn Sie eine weitere Schnittstelle in einer .h-Datei definieren, aber nicht alle diese Schnittstellen implementiert haben.

Der Linker kann die Implementierung nicht in der .m-Datei finden, daher müssen Sie sie für jede Schnittstelle in Ihrer .m-Datei implementieren.

So beheben Sie diesen Fehler:

Geben Sie in der Datei .m die Implementierung für jede Schnittstelle an. 2. neu aufbauen

Michael Yang
quelle
0

Ich habe nach der Installation des AWS-Frameworks das gleiche Problem, um dieses Problem zu beheben. Ich habe die POD-Konfigurationsdatei aus Ihrem Projekt aktualisiert, die nach der Installation von AWS POD erstellt wird. Überprüfen Sie die Konfigurationsdatei wie folgt

OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-AWSAutoScaling" -l"
Pods-   AWSCloudWatch" -l"Pods-AWSCognito" -l"Pods-AWSCore" -l
"Pods-AWSDynamoDB" -l"Pods-AWSEC2" -l"Pods-AWSElasticLoadBalancing" 
-l"Pods-AWSKinesis" -l"Pods-AWSLambda" -l"Pods-AWSMachineLearning" 
-l"Pods-AWSS3" -l"Pods-AWSSES" -l"Pods-AWSSNS" -l"
Pods-AWSSQS"-l "Pods-AWSSimpleDB" -l"Pods-Bolts" -l"Pods-FMDB" 
-l"Pods-GZIP" -l"Pods-Mantle" -l"Pods-Reachability" -l"Pods-TMCache" 
-l"Pods-UICKeyChainStore" -l"Pods-XMLDictionary" -l"sqlite3" -l
"z"-framework "Accelerate" -framework "AssetsLibrary" 
-framework "CoreLocation" -framework "Foundation" -framework
"ImageIO" -framework "Security" -framework "SystemConfiguration"
-framework "UIKit" -weak_framework "UIKit"
 OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS)   

Wenn Ihre Konfigurationsdatei nicht richtig funktioniert, setzen Sie Ihr Other Linker-Flag auf $ (geerbt).

Swapnil1156035
quelle
0

Wenn die Architektur- und Linkereinstellungen gut aussehen, überprüfen Sie Ihre h-Dateien. Mein Problem war der gleiche Fehler, aber ich hatte die h-Dateien umstrukturiert und eine externe Anweisung entfernt. Andere m-Dateien verwendeten diese Variable und verursachten den Linker-Fehler.

Nick
quelle
0

Das Hinzufügen von "Security.framework" hat den Trick für mich getan.

Eran Talmor
quelle