Simboli non definiti per l'architettura i386: _OBJC_CLASS _ $ _ SKPSMTPMessage ", referenziati da: errore


236

Ho importato un framework per l'invio di e-mail dall'applicazione in background, ad esempio SKPSMTPMessageFramework. Qualcuno può suggerire perché viene mostrato l'errore di seguito

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

Fonte da cui è tratto il quadro: -

Blocco dei campi in MFMailComposeViewController

Aggiornamento :

Risposta: basta trascinare e rilasciare la cartella sul progetto e fare clic su Copia. Questo è selezionare la casella di controllo del progetto e anche la casella di controllo di destinazione.


Dopo aver aggiunto SystemConfiguration.framework dalle fasi di compilazione il mio progetto si compila bene
swiftBoy

Ho risolto questo problema. Ho aggiunto il framework richiesto a Link Binary with Libraries.
Mihir Oza,

Risposte:


569

Puoi ottenere questo tipo di errore se il file .m della tua classe non è elencato nel passaggio "Compila origini" della scheda "Crea fasi" della tua destinazione. Normalmente Xcode fa questo per te, ma a volte perde la trama e devi aggiungere il file .m manualmente.

Per fare questo:

TargetSettings -> Build Phases -> Compila Sources -> aggiungi la tua classe .m -> Build and Run


49
A volte questi errori compaiono perché alcuni framework non sono collegati correttamente. Basta controllare tutti i framework in "Collega binario con librerie" nella scheda della fase di costruzione del progetto.
Heitara,

Questo può accadere anche con i file .c, e presumibilmente anche .mm.
Brodney,

Rajneesh, hai risolto il problema? Se sì, come lo hai risolto?
codematrix

9
Vale la pena notare che è possibile selezionare il file .m e selezionare la casella accanto al target nella sezione "Appartenenza target" del pannello di destra. Quando aggiungi un file al tuo progetto, ti viene chiesto se vuoi "Aggiungi ai target:", potresti aver detto di no, ma puoi aggiungerlo in qualsiasi momento facendo quello che ho detto.
Nicolas S,

4
Avevo lo stesso errore, la mia soluzione è: Build Build -> Linking -> Altre bandiere Linker -> Aggiungi -lLibraryName_$(PLATFORM_NAME)dper debug e aggiungi -lLibraryName_$(PLATFORM_NAME)per Release
George

37

per me il problema si è rivelato mancare di framework. Una volta aggiunti, ha funzionato.


Mi è sembrato un colpo lungo poiché in realtà non corrispondeva ai messaggi di errore che stavo ricevendo ma l'aggiunta dei framework dipendenti suggeriti sul sito SocketRocket lo ha risolto anche per me.
Pat

Anche se aggiungi quadri attraverso i cocoapodi, ciò può accadere. Ho dovuto aggiungerlo manualmente anche come framework. Grazie!
FBente,

Il Framework che ho aggiunto aveva bisogno di altri Frameworks da aggiungere prima che si costruisse. Se stai aggiungendo un Framework, assicurati di aver aggiunto qualsiasi Framework di cui potrebbe aver bisogno
Dave Patrick,

29

Controllare le proprietà valide di Architetture valide e costruire architettura attiva.

inserisci qui la descrizione dell'immagine


1
puoi per favore dirmi come aprire questa finestra di opzione in Xcode 4.2
Anand

Se questo non aiuta, vedi la risposta di Allen Pike di seguito.
MattyG,

Sia questa risposta che quella di Allen mi hanno aiutato. Ho davvero dovuto controllare entrambe le cose: compilare le fonti e costruire solo l'architettura attiva. Grazie mille ragazzi!
Bogdan,

@Anand Sono in Build Settings per il target.
LifeLogger

18

se stai usando cocoapods assicurati che le impostazioni di build del tuo target contengano $ (ereditato) nella sezione flag degli altri linker

inserisci qui la descrizione dell'immagine


10

Il tuo framework è compilato per armv (x)? Mi sembra che sia compilato per i386, il cui codice non verrà eseguito su un dispositivo iOS. Oppure è compilato per armv (x) e stai cercando di eseguirlo sul simulatore, che è il codice i386. Assicurati, usando le impostazioni di build Akshay visualizzate sopra, che il tuo framework sia compilato correttamente per il chip su cui lo eseguirai.


È risolto. ho dovuto trascinare e rilasciare framework forlder nel forlder del mio progetto in xCode. Grazie
Mann,

è possibile in qualche modo compilare un framework da eseguire contemporaneamente sia sul dispositivo iOS che sul simulatore? o dovrei sempre scegliere solo un'opzione?
Aleksey Tsyss,

Stai parlando di aprire due finestre per lo stesso progetto e impostarne una per l'esecuzione sul simulatore e un'altra sul dispositivo?
Owen Hartnett,

7

Se stai importando qualche altro progetto in xcode e se il progetto corrente e quello di importazione hanno entrambi gli stessi file nel sorgente del compilatore, rimuovi semplicemente lo stesso file nel progetto corrente nelle impostazioni "Fase di costruzione". Ha funzionato per me.


4

Sì, questo è legato a ciò che Allen ha detto ... cerca TargetMembership nella sezione Utilità del file sorgente. c'è una casella di controllo che associa quel file a un progetto. La verifica ha risolto questo problema anche per me.


Ho modificato tutte le altre impostazioni, ma questa è stata quella che finalmente l'ha risolto per me. Grazie!
Alec Thomas,

4

Inoltre, potrebbe mancare il collegamento a una libreria binaria, selezionare Fasi di creazione nei target, aggiungere le librerie richieste e quindi Prodotto> Pulisci prodotto> Crea

Anche quello deve funzionare!


4

Ho avuto questo problema quando ho aperto due volte lo stesso progetto, solo un progetto era l'originale e l'altro è stato clonato da un git url.

'Prodotto'> 'Pulizia' ha risolto il problema.


4

Ho anche riscontrato questo problema e l'ho risolto controllando se sia la sorgente di compilazione che il binario di collegamento con la libreria contenessero tutti i file / librerie / framework richiesti.

inserisci qui la descrizione dell'immagine


4

Quando ho riscontrato lo stesso problema di questo:

Simboli indefiniti per architettura i386:

_OBJC_CLASS _ $ _ SKPSMTPMessage, referenziato da: objc-class-ref in ConfirmController.o

Si è scoperto che ho appena dimenticato di aggiungere il framework. Era QuartzCore.framework per l'esattezza.


@JayprakashDubey Chiedi a Mitch per favore
D_D

4

prova questo ultimo:

così ho provato tutti i suggerimenti in questa pagina .. nessuno ha funzionato .. Il modo in cui il mio problema è iniziato è stato seguendo i passaggi di questo tutorial che insegna come collegare le librerie statiche. Con il mio progetto di esempio le istruzioni hanno funzionato bene .. ma poi sul mio progetto reale ho iniziato a ricevere l'errore sopra.

Quindi quello che ho fatto è stato passare attraverso ogni passaggio di detto tutorial e costruito dopo ogni passaggio .. la linea offensiva si è rivelata questa: aggiungere -all_load per costruire le impostazioni-> altri flag del linker

si scopre che questo flag è stato raccomandato una volta per collegare le categorie alle librerie statiche .. ma poi si è scoperto che questo flag non era più necessario Xcode 4.2+ .. (lo stesso vale per il flag -force_load .. che era anche consigliato in altri post ) ..


3

Quando ho riscontrato lo stesso problema, ho dimenticato di aggiungere "versione compilata della libreria (con estensione .a)". Normalmente aggiungiamo la libreria del progetto importato in Target Dependency in Build Phases ma dimentichiamo di aggiungere "library compilata" in Link Binary with Libraries in Build Phases.


3

Aggiungendo ciò che ha funzionato per me nel caso in cui altri abbiano lo stesso problema e finiscano qui. Avevo un progetto più vecchio con l'impostazione CLANG_ENABLE_MODULES impostata su No. Dopo ore di frustrazione ho confrontato con un progetto di lavoro e ho scoperto di avere Enable Modules Set su no sotto le mie impostazioni di build LLVM. L'impostazione su Sì ha risolto il mio problema e l'app si sviluppa correttamente.

Impostazioni progetto -> Crea impostazioni -> cerca 'Moduli' e aggiorna i moduli di abilitazione (C e Objective-C) a SÌ.


Correzione meravigliosa! Questo mi ha aiutato molto! Avevo un vecchio progetto di pod e ogni volta che aggiungevo un nuovo pod questo errore si sarebbe verificato. Grazie!!!
DiscDev,

2

Non ho aggiunto "-all_load -lstdc ++" ad altre bandiere linker nell'impostazione di creazione e sono stato in grado di avviare la sim senza errori ma non ho ottenuto l'output del registro MonkeyTalk quando avviato e uno script precedente che ho scritto che era usato per connettersi ora mostrava il pulsante di riproduzione come disabilitato. L'output di MT IDE è stato mostrato come "Connessione impostata su iOS Simulator", ma non è possibile selezionare il pulsante Esegui / Riproduci.

Il progetto originale aveva "ObjC -all_load" nelle bandiere degli altri linker e quando ho aggiunto "-all_load -lstdc ++" insieme ad esso ho ricevuto il messaggio di errore di questo post. Quando ho rimosso "ObjC -all_load" e ho aggiunto solo "-all_load -lstdc ++", il progetto è stato creato, ma ancora nessuna disconnessione da scimmia ha messo la conferma nella console


2

È possibile che tu stia utilizzando una libreria compilata solo per hardware REAL. Ad esempio, se stai usando una libreria Bluetooth come Zephyr HxM Smart, probabilmente non verrà compilata sul simulatore ed è pensata per funzionare solo su dispositivi reali.


1

Si è verificato un problema simile con IOS 6. È stato in grado di risolverlo aggiungendo storekit.framework al "Collegamento binario con librerie" nella sezione fasi di compilazione.

Ora funziona perfettamente.


1

ho lo stesso problema con 7 errori quando aggiungo PSTCollectionviewcontroller. L'unica soluzione per questo problema è controllare i tuoi "xcode -> fasi di costruzione -> compilare le fonti" qui aggiungi tutti i tuoi file ".m". Spero che questo post aiuterà gli utenti in futuro.


1

Sul mio, stavo usando Cocoapods per un progetto di Realtà Aumentata e quello che ho scoperto è che quando implementi i cocoapodi e apri lo spazio di lavoro del tuo progetto, finisci con il target del progetto Xcode e quei target Pod che hai implementato all'interno dello stesso file. Quello che stava succedendo era che alcuni dei .m venivano usati da entrambi. Dopo aver rimosso quelli duplicati per il target Xcode in Build Phases >> Compile Sources, ha funzionato bene.


1

Ho scoperto questo messaggio ALTAMENTE fuorviante durante il tentativo di eseguire l'aggiornamento alla nuova libreria di Google Analytics.

Nel mio caso il problema era avere DUE COPIE DI CONFLITTO della libreria. Si trovavano in cartelle diverse ma entrambi erano elencati nei percorsi di costruzione della libreria della mia app (in Impostazioni di costruzione).

Spostare tutti i file della libreria deprecati fuori dalla cartella ha finito per fare il trucco e ha fatto sparire i misteriosi messaggi di errore.


1

Verifica che tutte le risorse del bundle siano copiate in fase di creazione.



1

Il cambiamento nell'architettura attiva ha funzionato per me, una delle mie lib era usando i386.

Nelle impostazioni di creazione >> modifica Crea architettura attiva solo su da NO

Ha funzionato per me. Spero che aiuti anche gli altri.

inserisci qui la descrizione dell'immagine


"da NO a SÌ" è più facile da capire. Qualunque cosa, ha funzionato.
Victor Laerte,

0

La risposta è semplicemente trascinare e rilasciare la cartella sul progetto e fare clic su Copia.


0

Ho ricevuto questo messaggio quando trascino alcuni file di origine da un altro progetto. Quando li ho cancellati e poi li ho aggiunti tramite "Aggiungi file ..." dal menu File, è stato creato senza l'errore.


0

Ho avuto un errore simile con NSManagedObject ed è stato perché stavo usando Core Data ma mancava il framework Core Data in Build Phases - Link Binary With Libraries, come altri hanno risposto


Benvenuti in SO Sam. Quando rispondi a una domanda, prova ad aggiungere nuove intuizioni, ricerche o codice che non esistono già in un'altra risposta. Se vuoi semplicemente condividere che un'altra risposta ha funzionato per te, prova a votare o commentare la loro risposta invece di pubblicare una risposta duplicata.
Butch

0

È possibile ottenere questo tipo di errore se si aggiungono librerie di terze parti nel progetto che richiedono framework nativi non inclusi nel progetto.

È necessario guardare all'interno dei file .h e .m della libreria appena aggiunta e vedere quali framework sono necessari, quindi includere tali framework nel progetto (Target> Crea fasi> Collega binario con librerie).


0

Prova a rimuovere il framework, ripulisci il progetto, aggiungilo di nuovo e compila. Oppure Rimuovere la classe che è stata aggiunta da xcode nell'origine compilazione, pulire il progetto, aggiungerlo nuovamente e poi compilare.


0

Ricorda che puoi inserire alcune macro in qualsiasi controller di visualizzazione che chiama i file che hai già eliminato.

L'app non mostrerà alcun errore fino a quando non creerai la tua app, genererà l'errore in fase di compilazione nei file .o.

Ricorda di eliminare qualsiasi MACRO che chiama i file che hai già eliminato.

Grazie :)


0

Oltre a ciò che Allan ha fatto, aggiungendo le classi mancanti, ho seguito la soluzione di @ emdog4 e ho aggiunto la libreria Core Data andando a Build Phases in Xcode e sotto 'Link Binary with Libraries' facendo clic su + e selezionando 'CoreData.framework' . Questo risolto il mio errore

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.