simbolo / i non trovato / i per architecture i386


113

Quando provo a compilare con Xcode, ricevo il seguente errore:

  **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 sono sicuro di cosa significhi.

Risposte:



92

Se questo genere di cose appare all'improvviso, di solito significa che al progetto mancano alcuni framework di cui ha bisogno. Librerie e progetti dipendenti possono richiedere framework, quindi se ne hai aggiunto uno di recente, ciò può causare questo errore.

Per aggiungere framework, 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 trovare i framework di cui hai bisogno, ho trovato che usare Google è il più semplice, anche se potresti probabilmente usare anche la ricerca della guida di Xcode. Cerca uno dei simboli, facendo del tuo meglio per trovare il nome non alterato (ad es. SCNetworkReachabilityGetFlags), Quindi 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 è questa pagina:

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

Quindi nella parte superiore della pagina, ti dice quale framework usare, SystemConfigurationin questo caso. Quindi aggiungilo al progetto e compila di nuovo.

Quindi continua a farlo finché non funziona ...

Modifica: non ho mai usato il simulatore, ma questo è quello che fai sul dispositivo - presumo sia lo stesso ...


64

A volte ci sono file di origine che mancano dalla tua destinazione.

  1. esaminare quali simboli mancano
  2. destinazione-> fasi di compilazione-> compilazione sorgente
  3. aggiungere i file di origine mancanti se non sono elencati
  4. comando + b per beatitudine

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


1
Ciò può verificarsi spesso quando si uniscono due file di progetto in modo non pulito e l'appartenenza di destinazione viene persa.
Steven Hepting

1
Grazie mille, in qualche modo xcode non ha aggiunto il file .m richiesto nella fase delle fasi di compilazione!
Dreampowder

1
Grazie :) Aggiungi 2 file al progetto e solo dopo aver eseguito questi passaggi tutto è andato bene
user1105951

32

L'ho risolto usando il seguente metodo (per XCode 4):

1) Selezionare il progetto nella finestra di navigazione del progetto che mostrerà il riepilogo del progetto a destra

2) Selezionare le fasi di creazione della quarta scheda

3) Selezionare l'opzione Collega binario con libreria

4) Aggiungi il framework per il quale stai ottenendo

5) Spostare il framework dalla cartella principale alla cartella dei framework

6) Costruiscilo di nuovo e gli errori scompaiono.


Grazie. Ho trovato questa risposta alla ricerca di MFMailCompose e l'ho risolta aggiungendo MessageUI.framework
Frank Yin

17

Il problema è che l'appartenenza di destinazione per il campo aggiunto non è presente nella destinazione dell'app, quindi selezionare il file e aggiungere il segno di spunta alla casella dell'appartenenza di destinazione

Ad esempio, se l'errore mostrato nella definizione di un metodo in common.minserisci qui la descrizione dell'immagine


Ho ricevuto questo errore di simbolo non trovato ma la situazione era molto più semplice. Ho aggiunto un nuovo modulo (file) con una nuova funzione di cui avevo bisogno a uno dei miei schemi. Quando ho creato uno schema diverso, poche settimane dopo, la chiamata a quella funzione non è stata trovata. Aggiungerlo all'obiettivo era tutto ciò che era necessario.
Il

17

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

I ragazzi sopra avevano ragione sul fatto che la prima cosa che dovresti controllare è se ti sei perso l'aggiunta di framework, vedi i passaggi forniti da Pruthvid sopra.

Il mio problema, si è scoperto, era una classe di compilazione mancante dopo che l'ho cancellata e successivamente aggiunta di nuovo.

Controlla le tue "Fonti di compilazione" come mostrato per le classi di errore segnalate. Aggiungi le classi mancanti che hai creato.


2
GRAZIE ... Questo funziona per me. Stavo impiantando una lezione personalizzata. Copiato sia la classe personalizzata. h e .m nel progetto. Ha fatto un #import su di esso, l'errore viene comunque visualizzato. L'aggiunta della classe personalizzata '.m nella sezione "Compile Sources" ha risolto il problema!
GeneCode

Eccezionale! Ho avuto lo stesso problema di Rocotilos, ho importato una classe personalizzata, importata, ma ho ancora avuto problemi. Questo ha funzionato! Molte grazie!
Souleiman

8

Assicurati che il framework mancante sia effettivamente elencato in "Destinazione / Fasi di compilazione / Collega binario con librerie" se non aggiungilo. Come accennato prima, di solito indica un framework mancante.

Nel mio progetto c'erano due framework identici elencati, quando ne ho rimosso uno ho riscontrato questo errore, perché lo ha anche rimosso dalla lista "Link Binary With Libraries". Ho aggiunto di nuovo e il problema è scomparso (e ho ancora due framework elencati)


6

Ho corretto un errore simile nel mio progetto modificando le Impostazioni di costruzione> Architetture per TUTTI i miei obiettivi.

Il problema: quando ho aggiornato da Xcode 4.4 a Xcode 4.5, il mio progetto veniva comunque compilato bene sul simulatore ma non veniva compilato sui dispositivi. Sui dispositivi ha lanciato l'errore "simbolo / i non trovato per l'architettura armv7s", insieme al fuorviante "Apple Mach-O Linker Error" e "clang: error: comando linker non riuscito con codice di uscita 1 (usa -v per vedere l'invocazione )."

La causa (nel mio caso): il mio progetto aveva più obiettivi, e anche se le Impostazioni di compilazione > Architetture per l' obiettivo principale erano impostate per includere l'architettura armv7s, l'obiettivo principale dipendeva da un altro obiettivo (elencato in Fasi di creazione> Dipendenze) e Non avevo pensato di ripristinare le impostazioni di costruzione> Architetture per quell'altro obiettivo 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 no.


5

Il tuo progetto dipende da un altro progetto e questo è un obiettivo in quel progetto impostato per essere una dipendenza diretta del tuo obiettivo principale? Se questo è il caso e la dipendenza non è impostata, l'obiettivo dipendente potrebbe non essere costruito per tutte le configurazioni (cioè il simulatore)

Solo un'ipotesi folle.


4

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 viene visualizzata come "simbolo non trovato" quando viene richiamata da Obj-C. La soluzione consisteva nel modificare il tipo di file: in Xcode 4, utilizzare il riquadro delle informazioni estese per impostare il tipo di file su "Objective-C ++ Source"; in Xcode 3, usa "Ottieni informazioni" per cambiare il tipo di file in "source.cpp.objcpp".


4

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


2

In un progetto C ++ che utilizza una classe templatizzata definita , pur ricevendo lo stesso errore, ho selezionato il file .cpp con la classe templatizzata definita nel Navigatore progetto, quindi Elimina> Rimuovi riferimento. Anche il file .h associato, sebbene sia ancora referenziato nel progetto, deve avere un'istruzione #include al .cpp come segue:

#ifndef __CircularBuffer__CircularBufferT__
#define __CircularBuffer__CircularBufferT__

... snip ...

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

Se vuoi vedere, un semplice esempio di progetto è su GitHub :

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


2

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

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

L'altra cosa è che se hai aggiunto delle classi nelle risorse compilate e hai rimosso quelle classi dal progetto, viene visualizzato l'errore. La cosa migliore da fare è rimuovere le classi dalle risorse di compilazione (Impostazioni build -> sorgenti di compilazione) che sono state rimosse dal progetto.

Nel mio caso ho aggiunto le classi admob nel progetto e ho compilato il progetto. In un caso successivo non voglio includere adMob 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 admob dalle risorse di compilazione e ho risolto questo problema.


2

Questo mi è successo mentre cercavo di copiare la libreria demo di PSPDFKIT nel mio progetto. Ho seguito tutte le istruzioni nel sito + tutti i suggerimenti in questa pagina .. per qualche motivo ha continuato a dare l'errore di cui sopra, il problema era che se avessi grepped il messaggio nel metodo di errore .. appariva solo nel binario ( ovviamente non ho accesso al codice sorgente b / c devo pagarlo).

L'ho notato però nella pagina delle istruzioni:

inserisci qui la descrizione dell'immagine

Quindi sono andato alle viscere di quel file di configurazione e ho 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

Quindi sono andato al progetto di esempio fornito dall'autore della suddetta libreria .. e ho notato che i flag precedenti erano copiati testualmente sugli altri flag del linker nelle mie impostazioni di build .. tuttavia nel mio progetto .. non lo erano! .. Quindi Li ho semplicemente copiati e incollati nelle impostazioni di build del mio progetto altri flag del linker e tutto ha funzionato!

punto da togliere: se ti affidi a qualche file .xcconfig nella tua configurazione, ricontrolla con un codice sorgente di esempio o qualcosa del genere e assicurati che sia stato effettivamente applicato .. non è stato applicato correttamente nel mio caso


0

Un altro motivo per cui ciò potrebbe accadere è quando si aggiorna un SDK.

Se elimini semplicemente il gruppo e poi trascini la nuova cartella nel progetto, il "Percorso di ricerca della libreria" avrà entrambi gli SDK. Per risolvere, elimina semplicemente il vecchio percorso SDK.


0

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


0

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


0

Ho riscontrato questo problema in Xcode 11, la correzione stava cambiando l'obiettivo di distribuzione minima da 10.0 a 11.0, spero che questo aiuti qualcuno :)

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.