Errore di compilazione Xcode "Simboli non definiti per l'architettura x86_64"


168

Una domanda per principianti Xcode:

È la mia prima esperienza con Xcode 4.6.3.

Sto cercando di scrivere un programma console molto semplice, che cerca dispositivi BT accoppiati e li stampa su un NSLog.

Si costruisce con il seguente errore:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_IOBluetoothDevice", referenced from:
      objc-class-ref in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Ho cercato come un matto. Il problema comune dovrebbe essere un riferimento a un file, di cui vengono importati solo i file di intestazione e che il linker non rileva alcuna implementazione (file * .m). La libreria IOBluetooth è tuttavia un Framework standard come il Foundation Framework.

Cosa mi manca nella mia dichiarazione precedente?

Ho anche provato a costruirlo per una macchina a 32 bit (la build fallisce di nuovo). È chiaramente un errore del linker, tuttavia non ho idea di cosa si riferisca, tranne per il fatto che esiste un problema nel trovare l'implementazione per IOBluetoothDevice, sia sull'architettura x86 che x64, mentre i file di intestazione provengono da un framework incluso standard, chiamato IOBluetooth?

Per tua informazione il mio codice principale "main.m" è:

#import <Foundation/Foundation.h>
#import <IOBluetooth/objc/IOBluetoothDevice.h>          // Note the import for bluetooth
#import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h>   // Note the import for bluetooth


int main(int argc, const char * argv[])
{
    @autoreleasepool {
        IOBluetoothDevice *currentDevice;
        NSArray *devices = [ IOBluetoothDevice pairedDevices];


        for (id currentDevice in devices){
          NSLog(@"%i : %@",[ currentDevice classOfDevice ], [ currentDevice name ]);    
        }
    }
    return 0;
}

Grazie per qualsiasi aiuto o puntatore nella giusta direzione.


17
Prova ad aggiungere $(inherited)ad altre bandiere Linker , pulisci e costruisci.
Resty

1
Quando mi sono imbattuto in questo ho scoperto che dovevo andare su File Inspector per il file m e selezionare la casella in Target Membership per esportarlo (?) Nel modulo in cui stavo cercando di usarlo.
Landon Kuhn,

Risposte:


123

Sembra che ti manchi, incluso IOBluetooth.framework nel tuo progetto. Puoi aggiungerlo per:

-Fare clic sul progetto nella parte superiore sinistra del riquadro sinistro (l'icona blu).

-Nel riquadro centrale, fai clic sulla scheda Crea fasi.

-Sotto "Collega binario con librerie", fai clic sul pulsante più.

-Trova IOBluetooth.framework dall'elenco e premi Aggiungi.

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Questo farà in modo che le definizioni IOBluetooth.framework siano trovate dal linker. Puoi vedere che il framework è un membro del tuo target facendo clic sul framework nel riquadro di sinistra e vedendo l'appartenenza di destinazione del framework nel riquadro di destra (nota che ho spostato il framework nel gruppo Frameworks per scopi organizzativi):

inserisci qui la descrizione dell'immagine


3
Ha funzionato! Grazie mille anche per lo sforzo di fare alcuni screenshot!
RisingSun

La stessa cosa funziona bene per il framework oAuthIOS. Aggiungi il framework oAuthIOS dalla cartella pods al progetto root che stai cercando di creare
prodeveloper

1
Sto cercando IOBluetooth.framework, ma non è lì: S
Menno van der Krift

È strano, dovrebbe essere lì.
Chris Livdahl,

Eccezionale! Mi ha salvato alcune ore!
Bravo Kevin,

49

UPD

Apple richiede di utilizzare l' architettura arm64 . Non utilizzare le librerie x32 nel progetto

Quindi la risposta qui sotto non è più corretta!


Vecchia risposta

Il nuovo Xcode 5.1 imposta di default l'architettura armv7, armv7s e arm64 .

E a volte l'errore "build failure" Simboli indefiniti per l'architettura x86_64 "" può essere causato da questo. Perché, alcune librerie (non quelle di Apple) sono state compilate per x32 in origine e non supportano x64.

Quindi ciò di cui hai bisogno è cambiare le "Architetture" per il tuo obiettivo di progetto in questo modo

NB. Se stai usando Cocoapods, dovresti fare lo stesso per il target "Pods".

inserisci qui la descrizione dell'immagine


3
Fondamentalmente ho rimosso la cosa arm64 dalla proprietà Valid Architectures. Quindi, come mostrato in precedenza, sarà costretto solo a guardare cosa c'è nelle architetture valide immagino!
Randika Vishman,

@Vishman, ciao! C'è una buona risposta SO che copre la differenza tra Valid Architecturese Architectures.
Aleksey Potapov,

Risolti i miei errori collegati in Xcode 5 quando stavo cercando di eseguire il progetto nel simulatore iOS 7.1, nel simulatore iOS 6.x funzionava bene per impostazione predefinita, grazie :)
Zsivics Sanel

@BraveS: rimuovendo l'architettura arm64 funzionerà per i dispositivi a 64 bit?
Jayprakash Dubey,

1
@JayprakashDubey ciao ho caricato un appstore integrato con supporto a 64 bit hanno rifiutato la mia app. Quando sto provando ad aggiungere arm64, mi trovo di fronte a un errore di compilazione dell'errore "Simboli indefiniti per l'architettura x86_64". se rimuovo arm64 dall'architettura. e ho inserito arm64 in un'architettura valida. La mia app è stata approvata ???
SP Balu Kommuri,

31

Simboli non definiti per l'architettura x86_64: "_OBJC_CLASS _ $ _ xxx", a cui fa riferimento: objc-class-ref in yyy.o

Questo generalmente significa che stai chiamando "xxx" (potrebbe essere un framework o una classe) dalla classe "yyy". Il compilatore non è in grado di individuare "xxx", quindi si verifica questo errore.

È necessario aggiungere i file mancanti (in questo caso "xxx") facendo clic con il tasto destro sulla cartella del progetto nella finestra di navigazione e toccare l' opzione " Aggiungi file a" NomeProgramma " ".

Una finestra popup aprirà i file del tuo progetto nel Finder. Qui puoi vedere i file mancanti e aggiungerli al tuo progetto. Non dimenticare di selezionare la casella " Copia elementi se necessario ". In bocca al lupo!!


17

Ho anche visto questo errore su Xcode 7.2 quando i dati derivati ​​vengono danneggiati (nel mio caso ho interrotto una build e sospetto che fosse la causa principale).

Quindi, se le altre soluzioni (in particolare Chris e BraveS, che sospetto siano più probabili) non si adattano al tuo problema, prova a eliminare i dati derivati ​​(Seleziona: Finestra / Progetti / Dati derivati ​​-> Elimina) e ricostruisci.

(Aggiunto per riferimento da altri - So che alla domanda originale è stata data una risposta corretta).


14

Sotto Xcode 9.0b5 potresti riscontrarlo perché Xcode 9.0b5 contiene un bug in cui quando aggiungi il codice sorgente, non rispetta le impostazioni di destinazione. È necessario accedere e impostare manualmente le parole di destinazione di ciascun file:

Progetto Xcode con illustrazione manuale dell'appartenenza al target


13

Nel mio caso, non era una biblioteca, erano alcune classi ..

Simboli non
definiti per l'architettura x86_64: "_OBJC_CLASS _ $ _ ClassNmae", a cui fa riferimento: objc-class-ref in SomeClassName "..

d: simboli non trovati per l'architettura x86_64

clang: errore: comando linker non riuscito con codice di uscita 1 (usare -v per vedere l'invocazione)

Soluzione Avevo diversi obiettivi in ​​Xcode con diversi schemi (Production, Dev ecc.). Alcune delle mie implementazioni appena aggiunte (Class.m) mancavano in

Xcode-> Target-> Crea fasi-> Compila fonti

Quindi ho dovuto aggiungerli manualmente.

allora potrei compilare e compilare con successo.


questo ha risolto il mio problema. Stavo usando il framework dinamico. un'altra cosa è che non mi piace l'idea di aggiungere manualmente.
Toxicsun

9

Ho riscontrato anche lo stesso problema, i metodi sopra non funzioneranno. Ho cancellato accidentalmente i file nella seguente directory su di esso. inserisci qui la descrizione dell'immagine

O

~ / Library / Developer / Xcode / DerivedData /

inserisci qui la descrizione dell'immagine


4
Per coloro che si chiedono quale sia il percorso / comando effettivo: ~/Library/Developer/Xcode/DerivedData/ tramite la CLI è possibile ripulire la directory come segue:rm -rf ~/Library/Developer/Xcode/DerivedData/
Bramus,

6

Quando si aggiorna a Xcode 7.1, è possibile che venga visualizzato questo tipo di errore e non può essere risolto da nessuna delle risposte precedenti. Uno dei sintomi nel mio caso è stato che l'app viene eseguita sul dispositivo non nel simulatore. Probabilmente vedrai un numero enorme di errori relativi a quasi tutti i framework che stai utilizzando.

La correzione è in realtà abbastanza semplice. Devi solo eliminare una voce dall'impostazione "Percorsi di ricerca del framework", presente nella sezione TARGET> Impostazioni di costruzione> Percorsi di ricerca (assicurati che la scheda "Tutto" sia selezionata)

inserisci qui la descrizione dell'immagine

Se vedi un'altra voce qui (oltre a $ (ereditato)) per i tuoi target principali o il tuo target di test, elimina semplicemente il percorso difettoso da tutti i target e ricostruiscilo.


5

Ho scoperto che ciò può verificarsi anche se trascini una cartella con i file Objective-C nel tuo progetto. Se quella cartella appare blu, penso che indichi che non è collegata correttamente. È possibile verificarlo (se si utilizza il controllo versione) perché ogni volta che si aggiungono nuovi file il file pbxproj dovrebbe aggiornarsi con collegamenti a quei nuovi file. Tuttavia potresti scoprire che dopo aver aggiunto una cartella il file pbxproj non è cambiato (e quindi c'è un errore di collegamento). Quindi otterrai il completamento automatico e troverà le classi che hai importato, ma quando va a costruire effettivamente l'immagine fallisce con questo codice di errore.

La soluzione è non aggiungere la cartella ma piuttosto aggiungere i file. Fai questo e dovresti vedere l'aggiornamento del file pbxproj e dovrebbe correggere questo errore.

Ciò presuppone anche che tu abbia fatto ciò che è stato suggerito sopra e che tu abbia collegato correttamente tutti i quadri giusti.


5

Ho provato praticamente tutto qui, ma il mio problema si è rivelato essere i resti di una precedente build di cocoapodi. Ciò che ha funzionato per me è stato:

  1. rm -Rf Pods; pod install
  2. Elimina i dati derivati ​​(Finestra / Progetti ... seleziona la tua destinazione. Fai clic sul pulsante Elimina)
  3. Ricostruire

4

Ho avuto lo stesso errore, perché invece di eliminare un file ho semplicemente rimosso i riferimenti ad esso. Individuare il file nel Finder e rimuoverlo è stato di aiuto.


3

So che è una vecchia domanda, ma oggi ho avuto lo stesso errore e nessuna delle soluzioni di cui sopra ha funzionato.

L'ho risolto tuttavia impostando l'opzione:

Project -> Architecture -> Build Active Architecture Only

a Sì

e il progetto compila e costruisce correttamente


3

Ho affrontato questo problema molte volte. Questo di solito viene quando si elimina la cartella di generazione.

La soluzione semplice è disintegrare e installare nuovamente i file pod.

pod deintegrate
pod install

2

Se ricevi questo errore quando provi a collegarti a un file C, controlla prima i nomi delle funzioni per errori di battitura. Quindi ricontrolla che non stai provando a chiamare una funzione C da un ambiente C ++ / Objective-C ++ senza usare il extern C {}costrutto. Mi stavo strappando i capelli perché avevo una classe che era in un file .mm che cercava di chiamare le funzioni C. Non funziona perché in C ++ i simboli sono alterati. Puoi effettivamente vedere i simboli concreti generati usando lo strumento nm. Terminare il percorso dei file .o ed eseguire nm -gsul file che sta chiamando il simbolo e quello che dovrebbe avere il simbolo e si dovrebbe vedere se corrispondono o meno, il che può fornire indizi per l'errore.

nm -g file.o

È possibile controllare i simboli C ++ confusi con questo:

nm -gC file.o

2

Nel mio caso, ho creato un framework personalizzato con Target di distribuzione impostato su 9.1, ma il target di distribuzione della mia app era inferiore, che supporta 8.1. Ridurre al minimo il framework personalizzato Il target di distribuzione ha risolto il mio problema.


2

Sono in ritardo alla festa, ma ho pensato di condividere un altro scenario in cui ciò potrebbe accadere. Stavo lavorando su un framework e lo stavo distribuendo sui cocoapodi. Il framework aveva classi e protocolli sia obiettivi che rapidi, e stava costruendo con successo. Durante l'utilizzo di pod in un altro framework o progetto stava dando questo errore poiché mi sono dimenticato di includere i file .m in podspec. Includere i file .swtift, .h e .m nelle fonti podspec come di seguito: s.source_files = "Nome progetto / Nome progetto / ** / *. {Swift, h, m}"

Spero che risparmi tempo a qualcun altro.


2

Ho risolto aggiungendo "-lc ++" nelle altre bandiere Linker nelle Impostazioni di costruzione.


1

Per me, questo ha iniziato ad accadere dopo il conflitto di unione.

Ho provato a pulire e rimuovere la cartella di build, ma nessuna di queste ha aiutato. Questo problema continuava a verificarsi indipendentemente. Quindi ho ricollegato il riferimento eliminando i gruppi che erano problematici e sono stati nuovamente aggiunti al progetto e ha funzionato.



1

nel mio caso ho dovuto aggiungere

    target 'SomeTargetTests' do
        inherit! :search_paths
    end
al mio podfile e quindi cancellare la directory / Pods ed eseguire `pod install`

(Xcode 10.1)


1

Questo potrebbe aiutare qualcuno. Mi ci sono voluti giorni per finalmente capirlo. Sto lavorando in OBJ-C e sono andato a:

Project-> Build Phases-> Compile sourcese aggiunto il nuovo VC.mfile che avevo appena aggiunto.

Sto lavorando con il codice legacy e di solito sono un nuovo, veloce in OBJ-C, quindi non ho nemmeno pensato di importare i miei .mfile in una libreria di fonti.

MODIFICARE:

Ho affrontato questo problema una seconda volta ed era qualcos'altro. Questa risposta mi ha salvato dopo 5 ore di debug. Ho provato tutte le opzioni su questo thread e altro ancora. https://stackoverflow.com/a/13625967/7842175 Ti preghiamo di dargli credito se questo ti aiuta, ma fondamentalmente potresti aver bisogno di impostare il tuo file sul suo obiettivo in File Inspector.

Questo è il tuo ispettore di file, assicurati solo che tutti gli obiettivi di cui hai bisogno siano "spuntati"

Tutto sommato, questo è un codice di errore molto vago che potrebbe essere causato per molte ragioni, quindi continua a provare diverse opzioni.


1

A volte, mi dimentico di copiare la libreria da Release-universal e di copiare erroneamente da Release-iphoneos. Di solito Release-iphoneos contiene un file .a che è stato eliminato per X86. e quindi dà l'errore.


1

nel mio caso, rimuovendo la selezione dell'appartenenza di destinazione e quindi selezionando nuovamente risolvi il problema.

Controlla la risposta di William Cerniuk con la foto allegata.


0

Nel mio caso il problema era la compilazione dell'architettura del framework.
Io corro Xcode 11 e l'utilizzo di Swift 5.1

  • Avevo 3 obiettivi come:
    • MyApp
    • MyAppTests
    • MyAppFrameWork

Sono stato tentato di eseguire test ma il prodotto MyAppFrameWork è stato compilato per dispositivi iOS generici e l'obiettivo di test aveva bisogno di un braccio x86-64, quindi ho ricostruito Framework per simulatori iOS e casi di test che hanno iniziato a funzionare correttamente.

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.