Undefinierte Symbole für die Architektur i386: _OBJC_CLASS _ $ _ SKPSMTPMessage ", referenziert von: error

236

Ich habe ein Framework zum Senden von E-Mails aus einer Anwendung im Hintergrund importiert, z. B. SKPSMTPMessageFramework. Kann jemand vorschlagen, warum unten Fehler angezeigt wird

Undefined symbols for architecture i386:

"_OBJC_CLASS_$_SKPSMTPMessage", referenced from:
  objc-class-ref in ConfirmController.o

"_kSKPSMTPPartContentTransferEncodingKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartMessageKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartContentTypeKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

Quelle, aus der der Rahmen stammt: -

Sperren der Felder in MFMailComposeViewController

Update :

Antwort: Ziehen Sie den Ordner einfach per Drag & Drop über das Projekt und klicken Sie auf Kopieren. Das ist das Kontrollkästchen Projekt und Ziel auch.

Mann
quelle
Nachdem ich SystemConfiguration.framework aus den Build-Phasen hinzugefügt habe , lässt sich mein Projekt gut kompilieren
swiftBoy
Ich habe dieses Problem gelöst. Ich habe das erforderliche Framework hinzugefügt, um Binär mit Bibliotheken zu verknüpfen.
Mihir Oza

Antworten:

569

Sie können diese Art von Fehler erhalten, wenn die .m-Datei Ihrer Klasse nicht im Schritt "Quellen kompilieren" auf der Registerkarte "Phasen erstellen" Ihres Ziels aufgeführt ist. Normalerweise erledigt Xcode dies für Sie, aber manchmal verliert es den Plot und Sie müssen die .m-Datei manuell hinzufügen.

Um dies zu tun:

TargetSettings -> Build-Phasen -> Compile Sources -> Fügen Sie Ihre .m-Klasse hinzu -> Build and Run

Allen Pike
quelle
49
Manchmal treten diese Fehler auf, weil ein Framework nicht richtig verknüpft ist. Überprüfen Sie einfach alle Frameworks unter "Binär mit Bibliotheken verknüpfen" auf der Registerkarte "Build-Phase" des Projekts.
Heitara
Dies kann auch bei .c-Dateien und vermutlich auch bei .mm passieren.
Brodney
Rajneesh, haben Sie das Problem behoben? Wenn ja, wie haben Sie das Problem behoben?
Codematrix
9
Es ist erwähnenswert, dass Sie die .m-Datei auswählen und das Kästchen neben Ihrem Ziel im rechten Bereich "Zielmitgliedschaft" ankreuzen können. Wenn Sie Ihrem Projekt eine Datei hinzufügen, werden Sie gefragt, ob Sie "Zu Zielen hinzufügen" möchten. Möglicherweise haben Sie Nein gesagt, aber Sie können sie jederzeit hinzufügen, indem Sie das tun, was ich gesagt habe.
Nicolas S
4
Früher hatte ich den gleichen Fehler. Die Lösung für mich lautet: Build-Einstellung -> Verknüpfen -> Andere Linker-Flags -> -lLibraryName_$(PLATFORM_NAME)dZum Debuggen hinzufügen und -lLibraryName_$(PLATFORM_NAME)für Release
George
37

Für mich stellte sich heraus, dass es an Frameworks mangelte. Sobald ich sie hinzugefügt habe, hat es funktioniert.

Verma
quelle
Dies schien ein langer Weg zu sein, da es nicht wirklich mit den Fehlermeldungen übereinstimmte, die ich erhielt, aber das Hinzufügen der auf der SocketRocket-Site vorgeschlagenen abhängigen Frameworks hat es auch für mich behoben.
Pat
Selbst wenn Sie Frameworks über Cocoapods hinzufügen, kann dies passieren. Ich musste es auch manuell als Framework hinzufügen. Vielen Dank!
FBente
Für das von mir hinzugefügte Framework mussten andere Frameworks hinzugefügt werden, bevor es erstellt werden konnte. Wenn Sie ein Framework hinzufügen, überprüfen Sie, ob Sie das erforderliche Framework hinzugefügt haben
Dave Patrick,
29

Überprüfen Sie die Eigenschaften Nur gültige Architekturen und aktive Architektur erstellen.

Geben Sie hier die Bildbeschreibung ein

Akshay
quelle
1
Können Sie mir bitte sagen, wie ich dieses Optionsfenster in Xcode 4.2
Anand
Wenn dies nicht hilft, lesen Sie die Antwort von Allen Pike weiter unten.
MattyG
Sowohl diese als auch Allens Antwort haben mir geholfen. Ich musste wirklich beide Dinge überprüfen: Quellen kompilieren und nur aktive Architektur erstellen. Vielen Dank, Jungs!
Bogdan
@Anand Sie befinden sich in den Build-Einstellungen für das Ziel.
Lebenslogger
18

Wenn Sie Cocoapods verwenden, stellen Sie sicher, dass die Build-Einstellungen Ihres Ziels $ (geerbt) im Abschnitt " Andere Linker-Flags " enthalten

Geben Sie hier die Bildbeschreibung ein

Tim
quelle
10

Ist Ihr Framework für armv (x) kompiliert? Es sieht für mich so aus, als wäre es für i386 kompiliert, welcher Code auf einem iOS-Gerät nicht ausgeführt werden kann. Oder es wurde für armv (x) kompiliert und Sie versuchen, es auf dem Simulator auszuführen, bei dem es sich um i386-Code handelt. Stellen Sie mithilfe der oben angezeigten Build-Einstellungen von Akshay sicher, dass Ihr Framework für den Chip, auf dem Sie es ausführen möchten, korrekt kompiliert ist.

Owen Hartnett
quelle
Es ist sortiert. Ich musste nur Framework Forlder in meinen Projekt Forlder in xCode ziehen und ablegen. Danke
Mann
Ist es möglich, ein Framework zu kompilieren, das sowohl auf iOS-Geräten als auch auf Simulatoren gleichzeitig ausgeführt wird? oder sollte ich immer nur eine Option wählen?
Aleksey Tsyss
Sprechen Sie darüber, zwei Fenster für dasselbe Projekt zu öffnen und eines so einzustellen, dass es auf dem Simulator und eines auf dem Gerät ausgeführt wird?
Owen Hartnett
7

Wenn Sie ein anderes Projekt in xcode importieren und sowohl aktuelles als auch importiertes Projekt dieselben Dateien in der Compiler-Quelle haben, entfernen Sie einfach dieselbe Datei im aktuellen Projekt in den Einstellungen "Erstellungsphase". Es hat bei mir funktioniert.

star18bit
quelle
4

Ja, das hängt mit dem zusammen, was Allen gesagt hat. Suchen Sie im Abschnitt Dienstprogramme der Quelldatei nach TargetMembership. Es gibt ein Kontrollkästchen, das diese Datei einem Projekt zuordnet. Das Überprüfen dieses Problems löste dieses Problem auch für mich.

yeahdixon
quelle
Ich habe alle anderen Einstellungen geändert, aber dies war diejenige, die es endlich für mich behoben hat. Vielen Dank!
Alec Thomas
4

Möglicherweise fehlt Ihnen auch die Verknüpfung mit einer Binärbibliothek. Aktivieren Sie in Ihren Tarifen die Erstellungsphasen, fügen Sie die erforderlichen Bibliotheken hinzu und klicken Sie dann auf Produkt> Produkt bereinigen> Erstellen

Das muss auch funktionieren!

Gabriel Ramirez
quelle
4

Ich hatte dieses Problem, als ich dasselbe Projekt zweimal öffnete, nur ein Projekt war das Original und das andere wurde von einer Git-URL geklont.

'Produkt'> 'Reinigen' hat das Problem gelöst.

Kraftydevil
quelle
4

Ich bin auch auf dieses Problem gestoßen und habe es behoben, indem ich überprüft habe, ob sowohl die Kompilierungsquelle als auch die Link-Binärdatei mit der Bibliothek alle erforderlichen Dateien / Bibliotheken / Frameworks enthalten.

Geben Sie hier die Bildbeschreibung ein

yujohnnyzhou
quelle
4

Als ich auf dasselbe Problem stieß:

Undefinierte Symbole für die Architektur i386:

_OBJC_CLASS _ $ _ SKPSMTPMessage, referenziert von: objc-class-ref in ConfirmController.o

Es stellte sich heraus, dass ich nur vergessen habe, Framework hinzuzufügen. Es war QuartzCore.framework, um genau zu sein.

Mitch Viray
quelle
@ JayprakashDubey Fragen Sie Mitch bitte
D_D
4

versuchen Sie es zuletzt:

Also habe ich alle Vorschläge auf dieser Seite ausprobiert. Keiner hat funktioniert. Mein Problem begann damit, dass ich die Schritte in diesem Tutorial befolgte, in denen das Verknüpfen statischer Bibliotheken erläutert wird. Bei meinem Beispielprojekt funktionierten die Anweisungen einwandfrei. Bei meinem eigentlichen Projekt wurde jedoch der obige Fehler angezeigt.

Also habe ich jeden Schritt des genannten Tutorials durchlaufen und nach jedem Schritt erstellt. Die fehlerhafte Zeile stellte sich als die folgende heraus: Hinzufügen von -all_load zum Erstellen von Einstellungen-> anderen Linker-Flags

Es stellte sich heraus, dass dieses Flag einst empfohlen wurde, um Kategorien mit statischen Bibliotheken zu verknüpfen. Dann stellte sich heraus, dass dieses Flag nicht mehr erforderlich war. Xcode 4.2+. (Gleiches gilt für das Flag -force_load empfohlen in anderen Beiträgen ) ..

Abbood
quelle
3

Als ich auf dasselbe Problem stieß, vergaß ich, "kompilierte Version der Bibliothek (mit der Erweiterung .a)" hinzuzufügen. Normalerweise fügen wir die Bibliothek des importierten Projekts in Zielabhängigkeit in Build-Phasen hinzu, vergessen jedoch, "Kompilierte Bibliothek" in Link Binary mit Bibliotheken in Build-Phasen hinzuzufügen.

Balamurugan
quelle
3

Hinzufügen, was für mich funktioniert hat, falls andere das gleiche Problem haben und hier landen. Ich hatte ein älteres Projekt, bei dem die Einstellung CLANG_ENABLE_MODULES auf Nein gesetzt war. Nach stundenlanger Frustration verglich ich ein funktionierendes Projekt und stellte fest, dass ich unter meinen LLVM-Build-Einstellungen die Option Module aktivieren auf Nein gesetzt hatte. Das Setzen auf Ja hat mein Problem gelöst und die App funktioniert einwandfrei.

Projekteinstellungen -> Build-Einstellungen -> Suchen Sie nach 'Module' und aktualisieren Sie Enable Modules (C und Objective-C) auf YES.

jlichti
quelle
Wunderbare Lösung! Das hat mir sehr geholfen! Ich hatte ein altes Pods-Projekt und jedes Mal, wenn ich einen neuen Pod hinzufügte, trat dieser Fehler auf. Vielen Dank!!!
DiscDev
2

Ich habe das "-all_load -lstdc ++" nicht zu anderen Linker-Flags in der Build-Einstellung hinzugefügt und konnte die Sim ohne Fehler starten, aber ich habe beim Start keine MonkeyTalk-Protokollausgabe erhalten und das vorherige Skript, das ich geschrieben habe, um eine Verbindung herzustellen Jetzt wurde die Wiedergabetaste als deaktiviert angezeigt. Die Ausgabe der MT-IDE wurde als "Verbindung auf iOS-Simulator eingestellt" angezeigt, konnte jedoch die Schaltfläche "Ausführen / Abspielen" nicht auswählen.

Das ursprüngliche Projekt hatte "ObjC -all_load" in den anderen Linker-Flags und als ich das "-all_load -lstdc ++" anhängte, bekam ich die Fehlermeldung, um die es in diesem Beitrag geht. Als ich das "ObjC -all_load" entfernte und nur das "-all_load -lstdc ++" hinzufügte, baute das Projekt, aber immer noch kein Monkey Talk Logout als Bestätigung in die Konsole

Laser Hawk
quelle
2

Möglicherweise verwenden Sie eine Bibliothek, die nur für ECHTE Hardware kompiliert wurde. Wenn Sie beispielsweise eine Bluetooth-Bibliothek wie den Zephyr HxM Smart verwenden, wird diese wahrscheinlich nicht auf dem Simulator kompiliert und kann nur auf realen Geräten ausgeführt werden.

DiscDev
quelle
1

Es trat ein ähnliches Problem mit IOS 6 auf. Es konnte behoben werden, indem storekit.framework zum Abschnitt "Binär mit Bibliotheken verknüpfen" im Abschnitt "Erstellungsphasen" hinzugefügt wurde.

Jetzt funktioniert es wie ein Zauber.

Troy
quelle
1

Ich habe das gleiche Problem mit 7 Fehlern, wenn ich PSTCollectionviewcontroller hinzufüge. Die eine Lösung für dieses Problem besteht darin, Ihren "xcode -> Build-Phasen -> Quellen kompilieren" zu überprüfen. Fügen Sie hier alle ".m" -Dateien hinzu. Ich hoffe, Sie dies Post wird Benutzern in Zukunft helfen.

Naveen
quelle
1

Bei mir habe ich Cocoapods für ein Augmented Reality-Projekt verwendet. Als ich herausfand, dass beim Implementieren von Cocoapods und Öffnen des Arbeitsbereichs Ihres Projekts das Xcode-Projektziel und die Pods, die Sie in derselben Datei implementiert haben, angezeigt werden. Was geschah, war, dass einige der .m von beiden verwendet wurden. Nachdem ich die duplizierten für das Xcode-Ziel unter Build Phases >> Compile Sources entfernt hatte, funktionierte es einwandfrei.

Joao Paulo
quelle
1

Ich habe diese SEHR irreführende Meldung beim Versuch, auf die neue Google Analytics-Bibliothek zu aktualisieren, entdeckt.

In meinem Fall bestand das Problem darin, ZWEI KONFLIKTIERENDE KOPIEN der Bibliothek zu haben. Sie befanden sich in verschiedenen Ordnern, aber beide wurden in den Build-Pfaden der Bibliothek meiner App (unter Build-Einstellungen) aufgeführt.

Das Verschieben aller veralteten Bibliotheksdateien aus dem Ordner hat den Trick ausgeführt und die mysteriösen Fehlermeldungen verschwinden lassen.

bkbeachlabs
quelle
1

Überprüfen Sie, ob alle Ihre Bundle-Ressourcen in der Erstellungsphase kopiert wurden.

Arpan Dixit
quelle
1

Produkt => Sauber hat den Trick für mich gemacht

YogevSitton
quelle
1

Die Änderung der aktiven Architektur hat bei mir funktioniert. Eine meiner Bibliotheken verwendete i386.

In Build - Einstellungen >> Änderung Bauen Aktiv Architektur nur auf Ja von NO

Es hat bei mir funktioniert. Hoffe, es hilft auch anderen.

Geben Sie hier die Bildbeschreibung ein

Satish Mavani
quelle
"von NEIN zu JA" ist leichter zu verstehen. Wie auch immer, das hat funktioniert.
Victor Laerte
0

Die Antwort ist, dass Sie den Ordner einfach per Drag & Drop über das Projekt ziehen und auf Kopieren klicken.

Mann
quelle
0

Ich habe diese Meldung erhalten, als ich einige Quelldateien aus einem anderen Projekt gezogen und dort abgelegt habe. Als ich sie löschte und dann über "Dateien hinzufügen ..." aus dem Menü "Datei" hinzufügte, wurde sie ohne Fehler erstellt.

RyeMAC3
quelle
0

Ich hatte einen ähnlichen Fehler mit NSManagedObject und das lag daran, dass ich Core Data verwendete, aber das Core Data-Framework in Build Phases - Link Binary With Libraries fehlte, wie einige andere geantwortet haben

Sam
quelle
Willkommen bei SO Sam. Versuchen Sie bei der Beantwortung einer Frage, neue Erkenntnisse, Forschungsergebnisse oder Code hinzuzufügen, die in einer anderen Antwort noch nicht vorhanden sind. Wenn Sie einfach mitteilen möchten, dass eine andere Antwort für Sie funktioniert hat, versuchen Sie, die Antwort zu verbessern oder zu kommentieren, anstatt eine doppelte Antwort zu veröffentlichen.
Butch
0

Diese Art von Fehler kann auftreten, wenn Sie Ihrem Projekt Bibliotheken von Drittanbietern hinzufügen, für die native Frameworks erforderlich sind, die nicht in Ihrem Projekt enthalten sind.

Sie müssen in den .h- und .m-Dateien Ihrer neu hinzugefügten Bibliothek nachsehen, welche Frameworks erforderlich sind, und diese Frameworks dann in Ihr Projekt aufnehmen (Ziel> Phasen erstellen> Binär mit Bibliotheken verknüpfen).

Cosmin
quelle
0

Entfernen Sie das Framework, bereinigen Sie das Projekt, fügen Sie es wieder hinzu und kompilieren Sie es. Oder Entfernen Sie die Klasse, die von xcode in der Kompilierungsquelle hinzugefügt wurde, bereinigen Sie das Projekt, fügen Sie es wieder hinzu und erstellen Sie es.

Saif
quelle
0

Denken Sie daran, dass Sie in jedem Ansichts-Controller, der die bereits gelöschten Dateien aufruft, ein Makro einfügen können.

Die App zeigt keine Fehler an, bis Sie Ihre App erstellen. Sie wirft den Fehler in der Kompilierungsphase in .o-Dateien.

Denken Sie daran, alle MACRO zu löschen, die auf bereits gelöschte Dateien zugreifen.

Vielen Dank :)

Abo3atef
quelle
0

Zusätzlich zu dem, was Allan tat und fehlende Klassen hinzufügte, folgte ich der Lösung von @ emdog4 und fügte die Kerndatenbibliothek hinzu, indem ich zu Phasen in Xcode erstellen und unter "Binär mit Bibliotheken verknüpfen" auf das + klickte und das "CoreData.framework" auswählte. . Dies hat meinen Fehler behoben

malkoty
quelle