2011-01-29 29 views
104

Quando si cerca di compilare con Xcode, sto ottenendo il seguente errore:simbolo (s) non trovato per l'architettura i386

**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** 

Non so che cosa significa.

risposta

91

Se ottieni improvvisamente questo genere di cose, significa che al progetto mancano alcune strutture di cui ha bisogno. Le librerie e i progetti dipendenti possono richiedere framework, quindi se ne hai aggiunto uno di recente, questo può causare questo errore.

Per aggiungere strutture, fare clic con il pulsante destro del mouse sul nome del progetto nella vista del progetto, selezionare Add, quindi selezionare Existing frameworks... dall'elenco. Quindi trova la struttura con i simboli che ti mancano.

Per quanto riguarda il modo in cui si individuano i framework necessari, ho trovato che utilizzare google è il più semplice, anche se è possibile che si utilizzi anche la ricerca dell'aiuto Xcode. Cerca uno dei simboli, fai del tuo meglio per elaborare il nome senza maglie (ad es., SCNetworkReachabilityGetFlags), e il primo collegamento alla documentazione che trovi su developer.apple.com è spesso quello giusto. Di solito non devi cacciare molto lontano. In questo caso, questa è la pagina:

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

Poi nella parte superiore della pagina, ti dice che quadro di utilizzare, SystemConfiguration in questo caso. Quindi aggiungilo al progetto e ricompilalo.

Poi basta continuare a fare questo fino a quando non funziona ...

Edit: Non ho mai usato il simulatore, ma questo è ciò che si fa sul dispositivo - Penso che sia lo stesso ...

4

Il tuo progetto dipende da un altro progetto, ed è che un obiettivo in quel progetto è impostato per essere una dipendenza diretta dal tuo obiettivo principale? Se questo è il caso e la dipendenza non è impostata, la destinazione dipendente potrebbe non essere costruita per tutte le configurazioni (ad esempio il simulatore)

Solo un'ipotesi.

30

ho risolto utilizzando il seguente metodo (per XCode 4):

1) Selezionare il progetto nella finestra di navigazione del progetto che mostrerà sintesi del progetto sulla destra

2) Selezionare quarta scheda costruire fasi

3) Selezionare binario di collegamento con l'opzione biblioteca

4) Aggiungere quadro per il quale si stanno ottenendo

5) Spostare il quadro dalla cartella principale per i quadri cartella

6) Costruire di nuovo e gli errori se ne sono andati.

+0

Grazie. Ho trovato questa risposta alla ricerca di MFMailCompose, e ho risolto aggiungendo MessageUI.framework –

3

Un'altra situazione che può causare questo problema è se il codice chiama in C++ o viene chiamato dal codice C++. Ho avuto un problema con la funzione di utilità del mio file .C che si presenta come "simbolo non trovato" quando chiamato da Obj-C.La correzione era di cambiare il tipo di file: in Xcode 4, utilizzare il pannello informazioni esteso per impostare il tipo di file su "Origine Objective-C++"; in Xcode 3, usa "Ottieni informazioni" per cambiare il tipo di file in "source.cpp.objcpp".

7

Assicurarsi che il framework mancante sia effettivamente elencato in "Target/Build Phases/Link Binary With Libraries" se non è sufficiente aggiungerlo. Come accennato prima di solito indica un quadro mancante.

Nel mio progetto erano elencati due framework identici, quando ho rimosso uno di questi ho avuto questo errore, perché è stato rimosso anche dall'elenco "Link Binary With Libraries". Ho aggiunto di nuovo e il problema è scomparso (e ho ancora due framework elencati)

63

A volte ci sono file di origine che mancano dal tuo target.

  1. esaminare quali simboli mancano
  2. target-> costruire phases-> compilare fonte
  3. aggiungere i file di origine mancanti se non sono elencati
  4. comando + b per beatitudine

È possibile selezionare i file che sembrano "mancanti" e controllare nella barra delle utility di destra che le loro caselle di controllo siano selezionate per la destinazione che si sta costruendo.

+1

Questo può accadere spesso quando si uniscono due file di progetto non puliti e l'appartenenza di destinazione viene persa. –

+1

Grazie mille, in qualche modo xcode non ha aggiunto il file .m richiesto nella fase di costruzione! – dreampowder

+1

Grazie :) Aggiungi 2 file al progetto e solo dopo aver eseguito questi passaggi tutto era O.K – user1105951

16

pensato di aggiungere la mia soluzione per questo, dopo aver trascorso alcune ore sulla stesso errore :(

I ragazzi sopra fosse corretto che la prima cosa che si dovrebbe verificare è se si fosse perso l'aggiunta di quadri, vedere la passaggi forniti da Pruthvid sopra.

il mio problema, si è scoperto, era una classe di compilazione mancante dopo ho cancellato, e poi ha aggiunto indietro di nuovo.

Vedi i tuoi "Fonti di compilazione", come mostrato per la segnalati classi di errore Aggiungi tutte le classi mancanti che hai creato.

+2

GRAZIE ... Questo funziona per me. Stavo implanto una lezione personalizzata. Copiato sia la classe personalizzata. h e .m nel progetto. Ha scritto #import, ma l'errore viene fuori. Aggiungendo la classe personalizzata '.m nella sezione "Fonti di compilazione" è stato risolto! – GeneCode

+0

Fantastico! Ho avuto lo stesso problema di Rocotilos, ho importato una classe personalizzata, importata, ma ho ancora riscontrato problemi. Questo ha fatto il trucco! Molte grazie! – Souleiman

3

Nel mio caso nessuna delle soluzioni pubblicate ha funzionato. Ho dovuto cancellare il progetto e fare un nuovo checkout dal server SVN. Fortunatamente il progetto è stato ospitato in un sistema di controllo della versione. Non so cosa farei altrimenti.

0

Un'altra ragione per cui questo potrebbe accadere è quando UPGRADE un SDK.

Se si elimina semplicemente il gruppo e quindi si trascina e rilascia la nuova cartella da proiettare, il "Percorso di ricerca della libreria" avrebbe entrambi gli SDK. Per risolvere, basta eliminare il vecchio percorso SDK.

1

In un progetto di C++ utilizzando un definito templatized classe, mentre riceve lo stesso errore, ho selezionato file cpp con l'definita templatized classe nel Navigatore progetto, quindi Elimina> Elimina riferimento. Anche il file .h associato, mentre ancora si fa riferimento nel progetto, ha bisogno di avere una dichiarazione #include al cpp come segue:

#ifndef __CircularBuffer__CircularBufferT__ 
#define __CircularBuffer__CircularBufferT__ 

... snip ... 

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

Se volete vedere, un semplice esempio di progetto è on github:

Questo è un po 'di trucco indiretto e non ricordo la fonte originale di questa soluzione alternativa.

5

ho fissato un errore simile sul mio progetto modificando le impostazioni Corporatura> Architetture per TUTTI dei miei obiettivi.

Il problema: Quando ho aggiornato da Xcode 4.4 di Xcode 4.5, il mio progetto compilato ancora bene sul simulatore, ma non ha compilato sui dispositivi. Sui dispositivi ha gettato l'errore "simbolo (s) non trovato per architettura armv7s", insieme con il fuorviante "Errore del linker Apple Mach-O" e "clang: errore: comando linker fallito con il codice di uscita 1 (usare -v per vedi invocazione). "

La causa (nel mio caso): Il mio progetto erano bersagli multipli, e anche se le impostazioni di generazione> Architetture per la obiettivo principale è stato impostato per includere armv7s l'architettura, l'obiettivo principale dipendeva un altro obiettivo (elencato in Fasi di compilazione> Dipendenze) e non avevo pensato di ripristinare le impostazioni di generazione> Architetture per quell'altra destinazione, e ho dovuto cambiarlo per includere armv7s. Suppongo che il simulatore e il dispositivo funzionino su architetture diverse, ed è per questo che il simulatore era OK mentre il dispositivo non lo era.

1

Se questo errore appare all'improvviso, significa che al progetto mancano alcuni framework. Le librerie e i progetti dipendenti possono richiedere framework, quindi se ne hai aggiunto uno di recente, questo può causare questo errore.

Per aggiungere strutture, fare clic con il pulsante destro del mouse sul nome del progetto nella vista del progetto, selezionare Aggiungi, quindi selezionare Strutture esistenti dall'elenco. Quindi trova la struttura con i simboli che ti mancano.

L'altra cosa è se si sono aggiunte classi nelle risorse compilate e si sono rimosse le classi dal progetto, quindi viene visualizzato l'errore. La cosa migliore da fare è rimuovere le classi dalle risorse di compilazione (Impostazioni di compilazione -> fonti di compilazione) che sono state rimosse dal progetto.

Nel mio caso ho aggiunto le classi admob nel progetto e compilato il progetto. In un caso successivo non voglio includere admobs nel mio progetto quindi ho cancellato i riferimenti delle classi admob dal mio progetto. Quando si è verificato questo errore ho eliminato la classe .m del mio AdM da risorse di compilazione risolto questo problema.

1

Questo è successo a me durante il tentativo di copiare la libreria demo PSPDFKIT nel mio progetto. Ho seguito tutte le istruzioni nel sito + tutti i suggerimenti in questa pagina .. per qualche ragione continuava a dare l'errore di cui sopra, il problema era che se avessi fatto un grepping nel messaggio nel metodo error ... appariva solo nel binario (ovviamente non ho accesso al codice sorgente b/c devo pagare per questo).

ho notato questo nella pagina delle istruzioni però:

enter image description here

Così sono andato al coraggio di quel file di configurazione e abbiamo trovato questo:

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 

poi sono andato al progetto di esempio fornito dall'autore della suddetta libreria .. e ho notato che i precedenti flag in cui venivano copiati letteralmente negli altri linker flag nelle mie impostazioni di compilazione .. tuttavia nel mio progetto ... non erano! ... Quindi li ho semplicemente copiati e incollati in il mio progetto è in crescita d impostazioni altre flag linker e tutto ha funzionato!

take away point: se si sta facendo affidamento su qualche file .xcconfig sul setup, ricontrollare con un codice sorgente di esempio o qualcosa del genere e assicurarsi che sia stato effettivamente applicato .. non è stato applicato correttamente nel mio caso

15

il problema è che l'adesione di destinazione per l'aggiunta depositato manca al bersaglio app .Quindi selezionare il file e aggiungere il segno di spunta alla casella di appartenenza bersaglio

per esempio, se l'errore indicato in una definizione di metodo common.m enter image description here

+0

+1 per usare il Pannello :) – WaaleedKhan

+0

Ho ricevuto questo errore non trovato nel simbolo ma la situazione era molto più semplice. Ho aggiunto un nuovo modulo (file) con una nuova funzione di cui avevo bisogno per uno dei miei Schemi. Quando ho creato uno schema diverso poche settimane dopo, la chiamata a quella funzione non è stata trovata. L'aggiunta al bersaglio era tutto ciò che era necessario. – Will

0

Avevo usato un CLGeocoder senza aggiungere un Core.Location Struttura. Fondamentalmente questo errore può significare più cose. Spero che questo aiuti qualcun'altro.

0

Sono stato sconcertato da questo prima di rendermi conto solo di aver aggiunto un'interfaccia @ solo dati e ho dimenticato di aggiungere il blocco vuoto @implementation.

Problemi correlati