Symbol (e) für Architektur i386 nicht gefunden

113

Beim Versuch, mit Xcode zu kompilieren, wird folgende Fehlermeldung angezeigt:

  **Ld /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher normal i386
    cd /Users/doronkatz/Sites/xCode/iKosher
    setenv MACOSX_DEPLOYMENT_TARGET 10.6
    setenv PATH "/Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Xcode4/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 -arch i386 -isysroot /Xcode4/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk -L/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -L/Users/doronkatz/Sites/xCode/iKosher -F/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -filelist /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Intermediates/iKosher.build/Debug-iphonesimulator/iKosher.build/Objects-normal/i386/iKosher.LinkFileList -mmacosx-version-min=10.6 -all_load -ObjC -Xlinker -objc_abi_version -Xlinker 2 -lz -framework Security -framework CFNetwork -framework CoreData -framework Foundation -framework UIKit -framework CoreGraphics -framework QuartzCore -o /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher

Undefined symbols for architecture i386:
  "_UTTypeCreatePreferredIdentifierForTag", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_UTTypeCopyPreferredTagWithClass", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassMIMEType", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassFilenameExtension", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_SCNetworkReachabilitySetCallback", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityScheduleWithRunLoop", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityUnscheduleFromRunLoop", referenced from:
      -[Reachability stopNotifier] in Reachability.o
  "_SCNetworkReachabilityCreateWithName", referenced from:
      +[Reachability reachabilityWithHostName:] in Reachability.o
  "_SCNetworkReachabilityCreateWithAddress", referenced from:
      +[Reachability reachabilityWithAddress:] in Reachability.o
  "_SCNetworkReachabilityGetFlags", referenced from:
      -[Reachability currentReachabilityStatus] in Reachability.o
      -[Reachability isReachable] in Reachability.o
      -[Reachability isConnectionRequired] in Reachability.o
      -[Reachability isConnectionOnDemand] in Reachability.o
      -[Reachability isInterventionRequired] in Reachability.o
      -[Reachability isReachableViaWWAN] in Reachability.o
      -[Reachability isReachableViaWiFi] in Reachability.o
      ...
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status**

Ich bin mir nicht sicher, was es bedeutet.

Doz
quelle

Antworten:

92

Wenn so etwas plötzlich auftaucht, bedeutet dies normalerweise, dass dem Projekt einige Frameworks fehlen, die es benötigt. Für Bibliotheken und abhängige Projekte können Frameworks erforderlich sein. Wenn Sie also kürzlich eines hinzugefügt haben, kann dies zu diesem Fehler führen.

Um Frameworks hinzuzufügen, klicken Sie mit der rechten Maustaste auf den Projektnamen in der Projektansicht, wählen AddSie ihn Existing frameworks...aus und wählen Sie ihn aus der Liste aus. Suchen Sie dann das Framework mit den fehlenden Symbolen.

Wie Sie die benötigten Frameworks finden, habe ich mit Google am einfachsten gefunden, obwohl Sie wahrscheinlich auch die Xcode-Hilfesuche verwenden könnten. Suchen Sie nach einem der Symbole und geben Sie Ihr Bestes, um den entwirrten Namen (z. B. SCNetworkReachabilityGetFlags) herauszufinden. Dann ist der erste Dokumentationslink, den Sie unter developer.apple.com finden, häufig der richtige. Normalerweise muss man nicht sehr weit jagen. In diesem Fall ist das diese Seite:

https://developer.apple.com/documentation/systemconfiguration/scnetworkreachability-g7d

Am oberen Rand der Seite erfahren Sie dann, welches Framework SystemConfigurationin diesem Fall verwendet werden soll. Fügen Sie das dem Projekt hinzu und kompilieren Sie es erneut.

Dann mach einfach so weiter, bis es funktioniert ...

Bearbeiten: Ich habe den Simulator noch nie benutzt, aber das machen Sie auf dem Gerät - ich nehme an, es ist das gleiche ...

Cœur
quelle
64

Manchmal fehlen Quelldateien in Ihrem Ziel.

  1. Überprüfen Sie, welche Symbole fehlen
  2. Ziel-> Erstellungsphasen-> Quelle kompilieren
  3. Fügen Sie die fehlenden Quelldateien hinzu, wenn sie nicht aufgeführt sind
  4. Befehl + b für Glückseligkeit

Sie können die Dateien auswählen, die "fehlen", und in der rechten Dienstprogrammleiste überprüfen, ob ihre Kontrollkästchen für das von Ihnen erstellte Ziel aktiviert sind.

Nir Pengas
quelle
1
Dies kann häufig auftreten, wenn zwei Projektdateien unsauber zusammengeführt werden und die Zielmitgliedschaft verloren geht.
Steven Hepting
1
Vielen Dank, irgendwie hat xcode die erforderliche .m-Datei nicht in die Phase der Erstellungsphase eingefügt!
Traumpulver
1
Danke :) Füge 2 Dateien zum Projekt hinzu und erst nach diesen Schritten war alles in Ordnung
user1105951
32

Ich habe es mit der folgenden Methode gelöst (für XCode 4):

1) Wählen Sie das Projekt im Projektnavigationsfenster aus, in dem rechts die Projektzusammenfassung angezeigt wird

2) Wählen Sie die Erstellungsphase der 4. Registerkarte

3) Wählen Sie die Option Binär mit Bibliothek verknüpfen

4) Fügen Sie das Framework hinzu, für das Sie es erhalten

5) Verschieben Sie das Framework vom Hauptordner in den Framework-Ordner

6) Erstellen Sie es erneut und Fehler sind verschwunden.

Pruthvid
quelle
Danke dir. Ich fand diese Antwort auf der Suche nach MFMailCompose und löste sie durch Hinzufügen des MessageUI.framework
Frank Yin
17

Das Problem ist, dass die Zielmitgliedschaft für das hinzugefügte Feld im App-Ziel fehlt. Wählen Sie also die Datei aus und fügen Sie das Kontrollkästchen für die Zielmitgliedschaft hinzu

Zum Beispiel, wenn der Fehler in einer Methodendefinition in common.m angezeigt wirdGeben Sie hier die Bildbeschreibung ein

Lithu TV
quelle
Ich habe diesen Fehler "Symbol nicht gefunden" erhalten, aber die Situation war viel einfacher. Ich habe ein neues Modul (Datei) mit einer neuen Funktion hinzugefügt, die ich für eines meiner Schemata benötigte. Als ich einige Wochen später ein anderes Schema erstellte, wurde der Aufruf dieser Funktion nicht gefunden. Das Hinzufügen zum Ziel war alles, was benötigt wurde.
Will
17

Ich dachte, ich würde meine Lösung dafür hinzufügen, nachdem ich ein paar Stunden mit demselben Fehler verbracht habe :(

Die oben genannten Leute hatten Recht, dass Sie als Erstes überprüfen sollten, ob Sie das Hinzufügen von Frameworks verpasst haben. Weitere Informationen finden Sie in den obigen Schritten von Pruthvid.

Es stellte sich heraus, dass mein Problem darin bestand, dass eine Kompilierungsklasse fehlte, nachdem ich sie gelöscht und später wieder hinzugefügt hatte.

Überprüfen Sie Ihre "Quellen kompilieren" wie für die gemeldeten Fehlerklassen gezeigt. Fügen Sie fehlende Klassen hinzu, die Sie erstellt haben.

Justinkoh
quelle
2
DANKE ... Das funktioniert bei mir. Ich habe eine benutzerdefinierte Klasse implementiert. Kopierte beide benutzerdefinierten Klassen. h und .m in das Projekt. Habe einen #import drauf, trotzdem kommt der Fehler raus. Das Hinzufügen der benutzerdefinierten Klasse '.m zum Abschnitt "Quellen kompilieren" hat das Problem behoben!
GeneCode
Genial! Ich hatte das gleiche Problem wie Rocotilos, ich importierte eine benutzerdefinierte Klasse, importierte, hatte aber immer noch ein Problem. Das hat es geschafft! Vielen Dank!
Souleiman
8

Stellen Sie sicher, dass das fehlende Framework tatsächlich unter "Ziel / Erstellungsphasen / Binär mit Bibliotheken verknüpfen" aufgeführt ist, wenn Sie es nicht einfach hinzufügen. Wie bereits erwähnt, weist dies normalerweise auf ein fehlendes Framework hin.

In meinem Projekt wurden zwei identische Frameworks aufgelistet. Als ich eines davon entfernte, trat dieser Fehler auf, da es auch aus der Liste "Binär mit Bibliotheken verknüpfen" entfernt wurde. Ich habe wieder hinzugefügt und das Problem ist verschwunden (und ich habe immer noch zwei Frameworks aufgelistet)

Tibidabo
quelle
6

Ich habe einen ähnlichen Fehler in meinem Projekt behoben, indem ich die Build-Einstellungen> Architekturen für ALLE meine Ziele geändert habe.

Das Problem: Als ich ein Upgrade von Xcode 4.4 auf Xcode 4.5 durchführte, wurde mein Projekt auf dem Simulator noch einwandfrei kompiliert, auf Geräten jedoch nicht. Auf Geräten wurde der Fehler "Symbol (e) für Architekturarmv7s nicht gefunden" sowie der irreführende Befehl "Apple Mach-O Linker Error" und "clang: error: linker" mit Exit-Code 1 fehlgeschlagen (verwenden Sie -v, um den Aufruf anzuzeigen) ). "

Die Ursache (in meinem Fall): Mein Projekt hatte mehrere Ziele, und obwohl die Build-Einstellungen> Architekturen für die Hauptziel so eingestellt waren, dass sie die armv7s-Architektur enthalten, hing das Hauptziel von einem anderen Ziel ab (aufgeführt unter Build-Phasen> Abhängigkeiten) und Ich hatte nicht daran gedacht, die Build-Einstellungen> Architekturen für dieses andere Ziel zurückzusetzen, und ich musste dies ändern, um armv7s einzuschließen. Ich nehme an, der Simulator und das Gerät laufen auf unterschiedlichen Architekturen, und deshalb war der Simulator in Ordnung, während das Gerät nicht in Ordnung war.

Josh
quelle
5

Hängt Ihr Projekt von einem anderen Projekt ab, und ist dieses Ziel in diesem Projekt so eingerichtet, dass es eine direkte Abhängigkeit von Ihrem Hauptziel darstellt? Wenn dies der Fall ist und die Abhängigkeit nicht eingerichtet ist, wird das abhängige Ziel möglicherweise nicht für alle Konfigurationen (dh den Simulator) erstellt.

Nur eine wilde Vermutung.

James J.
quelle
4

Eine andere Situation, die dieses Problem verursachen kann, besteht darin, dass Ihr Code C ++ aufruft oder von C ++ - Code aufgerufen wird. Ich hatte ein Problem mit der Dienstprogrammfunktion meiner eigenen .c-Datei, die beim Aufruf von Obj-C als "Symbol nicht gefunden" angezeigt wurde. Das Update bestand darin, den Dateityp zu ändern: Verwenden Sie in Xcode 4 den erweiterten Infobereich, um den Dateityp auf "Objective-C ++ Source" festzulegen. Verwenden Sie in Xcode 3 "Get Info", um den Dateityp in "source.cpp.objcpp" zu ändern.

ungültiger Name
quelle
4

In meinem Fall hat keine der veröffentlichten Lösungen funktioniert. Ich musste das Projekt löschen und einen neuen Checkout vom SVN-Server durchführen . Glücklicherweise wurde das Projekt in einem Versionskontrollsystem gehostet. Ich weiß nicht, was ich sonst tun würde.

otaviokz
quelle
2

In einem C ++ Projekt eine definierte Verwendung templatized Klasse, während den gleichen Fehler zu erhalten, ich CPP - Datei mit der definierten ausgewählten templatized Klasse im Projekt - Navigator, dann Löschen> Entfernen Referenz. Auch die zugehörige .h-Datei, auf die im Projekt noch verwiesen wird, muss die Anweisung #include für die .cpp wie folgt enthalten:

#ifndef __CircularBuffer__CircularBufferT__
#define __CircularBuffer__CircularBufferT__

... snip ...

#include "CircularBufferT.cpp"
#endif /* defined(__CircularBuffer__CircularBufferT__) */

Wenn Sie sehen möchten, finden Sie ein einfaches Projektbeispiel auf github :

Dies ist ein kleiner Trick der Indirektion, und ich erinnere mich nicht an die ursprüngliche Quelle dieser Problemumgehung.

vmanjz
quelle
2

Wenn dieser Fehler plötzlich auftritt, fehlen dem Projekt einige Frameworks. Für Bibliotheken und abhängige Projekte können Frameworks erforderlich sein. Wenn Sie also kürzlich eines hinzugefügt haben, kann dies zu diesem Fehler führen.

Um Frameworks hinzuzufügen, klicken Sie mit der rechten Maustaste auf den Projektnamen in der Projektansicht, wählen Sie Hinzufügen und dann Vorhandene Frameworks aus der Liste. Suchen Sie dann das Framework mit den fehlenden Symbolen.

Die andere Sache ist, wenn Sie Klassen zu den kompilierten Ressourcen hinzugefügt und diese Klassen aus dem Projekt entfernt haben, erscheint der Fehler. Am besten entfernen Sie die Klassen aus den Kompilierungsressourcen (Build-Einstellungen -> Kompilierungsquellen), die aus dem Projekt entfernt wurden.

In meinem Fall habe ich die Admob-Klassen im Projekt hinzugefügt und das Projekt kompiliert. In einem späteren Fall möchte ich keine Admobs in mein Projekt aufnehmen, daher habe ich die Referenzen der Admob-Klassen aus meinem Projekt gelöscht. Als dieser Fehler auftrat, löschte ich die .m-Klasse meines Admob aus den Kompilierungsressourcen, um dieses Problem zu lösen.

Abhilash Reddy kallepu
quelle
2

Dies ist mir passiert, als ich versucht habe, über das PSPDFKIT zu kopieren in mein Projekt . Ich habe alle Anweisungen auf der Website + alle Vorschläge auf dieser Seite befolgt. Aus irgendeinem Grund gab es immer wieder den obigen Fehler. Das Problem war, dass die Nachricht in der Fehlermethode nur in der Binärdatei angezeigt wurde ( offensichtlich habe ich keinen Zugriff auf den Quellcode (b / c muss ich dafür bezahlen).

Ich habe dies jedoch auf der Anweisungsseite bemerkt:

Geben Sie hier die Bildbeschreibung ein

Also ging ich zu den Eingeweiden dieser Konfigurationsdatei und fand Folgendes:

OTHER_LDFLAGS=$(inherited) -ObjC -fobjc-arc -lz -framework CoreText -framework CoreMedia -framework MediaPlayer -framework AVFoundation -framework ImageIO -framework MediaPlayer -framework MessageUI -framework CoreGraphics -framework Foundation -framework QuartzCore -framework AVFoundation -framework CFNetwork -framework MobileCoreServices -framework SystemConfiguration -weak_framework UIKit

Dann ging ich zu dem vom Autor der genannten Bibliothek bereitgestellten Beispielprojekt. Dabei stellte ich fest, dass die vorherigen Flags in meinen Build-Einstellungen wörtlich auf die anderen Linker-Flags kopiert wurden. In meinem Projekt waren sie es jedoch nicht! Ich habe sie einfach kopiert und in die Build-Einstellungen meines Projekts eingefügt, andere Linker-Flags und alles hat funktioniert!

Take-Away-Punkt: Wenn Sie sich bei Ihrem Setup auf eine .xcconfig-Datei verlassen, überprüfen Sie diese anhand einer Beispielcodequelle oder Ähnlichem und stellen Sie sicher, dass sie tatsächlich angewendet wurde. In meinem Fall wurde sie nicht richtig angewendet

Abbood
quelle
0

Ein weiterer Grund, warum dies passieren könnte, ist das UPGRADEN eines SDK.

Wenn Sie einfach die Gruppe löschen und dann den neuen Ordner per Drag & Drop in das Projekt ziehen, enthält der "Bibliothekssuchpfad" beide SDKs. Löschen Sie zum Lösen einfach den alten SDK-Pfad.

Samwize
quelle
0

Ich hatte einen CLGeocoder verwendet, ohne ein Core.Location Framework hinzuzufügen. Grundsätzlich kann dieser Fehler mehrere Dinge bedeuten. Ich hoffe das hilft jemand anderem.

Logixologe
quelle
0

Ich war schon einmal verblüfft, nur um festzustellen, dass ich eine reine Datenschnittstelle hinzugefügt und vergessen habe, den leeren @ Implementierungsblock hinzuzufügen.

Steve Tranby
quelle
0

Ist dieses Problem in Xcode 11 aufgetreten. Das Problem wurde behoben, indem das Mindestbereitstellungsziel von 10.0 auf 11.0 geändert wurde. Ich hoffe, dies hilft jemandem :)

VeganKid
quelle