Simboli indefiniti per l'architettura armv7


307

Questo problema mi ha fatto impazzire e non riesco a capire come risolverlo ...

    Undefined symbols for architecture armv7:
  "_deflateEnd", referenced from:
      -[ASIDataCompressor closeStream] in ASIDataCompressor.o
  "_OBJC_CLASS_$_ASIDataDecompressor", referenced from:
      objc-class-ref in ASIHTTPRequest.o
  "_deflate", referenced from:
      -[ASIDataCompressor compressBytes:length:error:shouldFinish:] in ASIDataCompressor.o
  "_deflateInit2_", referenced from:
      -[ASIDataCompressor setupStream] in ASIDataCompressor.o
ld: symbol(s) not found for architecture armv7
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

Penso che abbia a che fare con:

ld: symbol(s) not found for architecture armv7

Ma ho aggiunto: libz.1.2.3.dylibe non aiuta, qualcuno ha qualche idea?


Un'altra possibilità non trattata in nessuna delle risposte esistenti è che potresti usare l' -ObjCaltro flag linker e quindi sono visibili Obj-C da librerie statiche esterne che stai usando che non dovrebbero essere visibili (come quelle di Parse). Vedere la mia risposta, se questo è il caso: stackoverflow.com/a/26151208/901641
ArtOfWarfare

2
Come regola generale, a volte XCode fornisce il tipo di errori come Match-O e il simbolo non trovato per l'architettura i386 (o altro) quando i file non sono stati aggiunti al progetto. Puoi fare clic con il tasto destro sulla cartella del progetto ed eseguire "Aggiungi file a <progetto>".
Fabricio PH

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
james_alvarez

Qualcuno qui può aiutarmi? Ricevo l'errore di seguito, ma nessuna delle soluzioni precedenti funziona per me. Ho già trascorso giorni con tutte le impostazioni possibili. Undefined symbols for architecture armv7: "YGConfig::YGConfig(int (*)(YGConfig*, YGNode*, YGLogLevel, char const*, void*))", referenced from: _YGConfigNew in libyoga.a(Yoga.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
diavolo rosso,

Risposte:


506

Cause comuni

Le cause comuni di "Simboli indefiniti per l'architettura armv7" sono:

  1. Si importa un'intestazione e non si collega alla libreria corretta . Questo è comune, specialmente per le intestazioni di librerie come QuartzCore poiché non è incluso nei progetti per impostazione predefinita. Risolvere:

    • Aggiungi le librerie corrette nella Link Binary With Librariessezione di Build Phases.

    • Se si desidera aggiungere una libreria al di fuori del percorso di ricerca predefinito, è possibile includere il percorso nel Library Search Pathsvalore nelle Impostazioni
      -l{library_name_without_lib_and_suffix}di compilazione e aggiungere (ad es. Per libz.a use -lz) alla Other Linker Flagssezione di Build Settings.

  2. È copiare i file nel vostro progetto, ma è dimenticato di controllare l'obiettivo di aggiungere i file . Risolvere:

    • Apri il Build Phasesper la destinazione corretta, espandi Compile Sourcese aggiungi i .mfile mancanti . Se questo è il tuo problema, vota anche la risposta di Cortex di seguito .

  3. È una biblioteca statica che è costruito per un'altra architettura come i386, il simulatore sul vostro computer host. Risolvere:

    • Se si desidera includere nel progetto più file di libreria dal proprio rivenditore di librerie, è necessario includere quello per il simulatore (i386) e quello per il dispositivo (ad esempio armv7).

    • Facoltativamente, è possibile creare una libreria statica avanzata che contenga entrambe le architetture.



Risposta originale:

Non hai effettuato il collegamento con il file libz corretto. Se fai clic con il pulsante destro del mouse sul file e visualizzi nel Finder il percorso dovrebbe trovarsi da qualche parte in una cartella sdk di iOS. Ecco il mio per esempio

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib

Consiglio di rimuovere il riferimento e quindi di aggiungerlo nuovamente nella sezione Collegamento binario con librerie Crea fasi del target.


4
Potrebbe anche essere necessario aggiungere la parola "-licucore" nelle impostazioni del progetto / Altre bandiere linker. È stato aggiunto automaticamente per la mia build di debug ma non per quella di rilascio, quindi non si sarebbe compilato.
JulianB,

4
Ho avuto lo stesso problema. Non ho davvero letto correttamente le note di installazione, quindi non avevo notato che la nuova versione di bugsense ha bisogno del binario libz aggiunto nelle fasi di compilazione.
Max MacLeod

2
Sei sicuro di aver incluso una sezione @implementation nel tuo rispettivo file .m per tutte le classi che hai dichiarato nel tuo file di intestazione?
slcott,

7
Voglio solo aggiungere, penso che sia stato davvero rispettoso da parte tua fare riferimento a un'altra risposta a questa domanda e dirci di votarla se ciò ha aiutato.
Andrew,

Grazie per l'aiuto! :) Per me ha aiutato a digitare in modo esplicito nella sezione Altre Bandiere Linker: -framework <FrameWorkName>. Ho avuto problemi con XCTest, quindi ho dovuto aggiungere -framework XCTest. Grazie! :)
piotr_ch,

198

Ho avuto un problema simile la scorsa notte e il problema era legato al fatto che avevo trascinato una lezione dal Finder al mio progetto in Xcode.

La soluzione era quella di andare alla scheda Build Fhases e quindi Compile Sources e assicurarsi di trascinare la classe nell'elenco.


6
Vorrei aver capito che questa era la risposta che stavo cercando prima. In alternativa puoi assicurarti di selezionare "Aggiungi ai target" quando copi le classi.
T. Markle,

1
Whoa ... così felice che la correzione sia stata così facile! Per essere chiari, se aggiungi una classe trascinando dal Finder nel tuo progetto, XCode non sempre li aggiunge all'elenco delle fasi di costruzione apparentemente. Ho appena premuto il pulsante "+" in "Compila fonti" durante le fasi di compilazione, ho aggiunto tutti i file offensivi e compilato immediatamente.
Amos,

1
Wow. Apple ha davvero bisogno di riconsiderare i loro messaggi di errore.
devios1

2
Un altro modo per risolvere questo problema è selezionare il file che si dice manchi. e apri la barra di scorrimento "Utilità". (Quello è l'estrema destra) E scegli "File Inspector". Quindi assicurati che sia presente un segno di spunta nel progetto in "Target Membership". Sto usando Xcode 4.6.2
zingle-dingle

1
Non sapevo quale file mancava, quindi ho mostrato le fasi di generazione nell'editor assistente (la seconda vista di modifica). Ho aperto il file offensivo nella vista di modifica a sinistra e ho verificato che ciascuno dei file importati esistesse in Fasi di compilazione. Ho aggiunto quello che non lo ha fatto ed è stato risolto.
Dan Sandland,

38

Ho avuto un problema simile e ho dovuto selezionare "Costruisci solo architettura attiva" su ciascuna delle configurazioni del progetto (debug, rilascio e distribuzione) e nelle impostazioni di costruzione del target.


3
Ha fatto anche il trucco per me. Era solo necessario nel progetto principale però.
Kirualex,

4
Incontro gli stessi problemi. Le Build Active Architecture Onlyimpostazioni sono diverse tra Podse il mio progetto. Nella fase di collegamento, non è riuscito.
AechoLiu,


14

Ho avuto un problema simile con quello. Il nome della classe dopo _OBJC_CLASS _ $ _ era in realtà la mia classe. Il motivo era che non ho spuntato "Aggiungi alla destinazione" quando trascino i file del codice sorgente nell'elenco di navigazione.

La mia soluzione era:

  1. elimina la classe dall'elenco di navigazione e scegli "rimuovi solo riferimento"

  2. trascina nuovamente i file del codice sorgente e assicurati che la casella "Aggiungi a destinazione" sia selezionata. La casella è appena sotto "Copia se necessario" e "Crea gruppo".


Solo per aggiungere: sebbene questa NON sia LA CAUSA PIÙ COMUNE dell'errore, mi capita solo la tua risposta (non ho spuntato la casella) ora.
Adam,

8

Di solito esiste un alias senza identificatore di versione collegato alla versione corrente, in questo caso libz.dylib è collegato a libz.1.2.5.dylib. Utilizzare l'alias di base anziché quello con versione.


5

In Target -> Impostazioni build -> Lingua del compilatore LLVM di Apple: l'impostazione di "C ++ Language Dialect" e "C ++ Standard Library" su Default del compilatore ha aiutato a risolverlo.


5

Ho solo aggiunto libz.1.2.5.dylib al mio progetto e ha funzionato come un fascino.

Passaggi -

  1. Vai a Costruisci fasi.
  2. Collega binario con libreria - usa il pulsante '+' per scegliere i framework e le librerie da aggiungere.
  3. Seleziona libz.1.2.5.dylib dall'elenco.
  4. Costruisci ed esegui.

5

Ho avuto un problema simile e ho visto errori relativi a "std ::"

Ho modificato le impostazioni di compilazione -> Apple LVM 5.0 - Lingua C ++ -> Libreria standard C ++

da libc ++ (libreria standard C ++ LLVM con supporto C ++ 11) a libstdc ++ (libreria standard C ++ GNU)


5

Ho avuto lo stesso problema quando utilizzo la libreria di admob, l'ho risolto cambiando "Architetture" in "Architetture standard armv7, armv7s" senza includere 64 bit. Crea impostazioni


4

Ho più @interfaces nel file .h e non avevo ancora incluso tutte le direttive @implementation corrispondenti. Assicurarsi che siano tutti bilanciati.


4

Se hai la bandiera -ObjCsotto il tuo Target> Impostazioni di costruzione> Altre bandiere linker e stai riscontrando questo problema, considera di rimuoverlo. Se l'hai aggiunto intenzionalmente perché devi caricare del codice Obj-C da una libreria statica che normalmente non verrebbe caricata altrimenti, IE, una categoria Obj-C, allora dovresti usare -force_load <path>invece di -ObjC.

<path>dovrebbe essere relativo alla directory del progetto Xcode. IE, se la struttura della directory è simile alla seguente:

iOSProject
  + iOSAPI.framework
      + iOSAPI
  + iOSAPI.xcodeproj

Quindi dovresti avere questo flag impostato per Other Linker Flags:

-force_load iOSAPI.framework/iOSAPI

Se si desidera includere più librerie del genere, è necessario includere una -force_loadriga separata per ognuna di esse.

-force_load iOSAPI.framework/iOSAPI
-force_load another.framework/another

4

Ecco come ho riscontrato questo problema:

Ho aggiunto un .h, .m e NIB da un altro progetto trascinandoli sul mio navigatore del progetto. Xcode non li ha aggiunti correttamente alle fasi di generazione.

Controlla la mia risposta perché ho avuto un problema simile che sono stato in grado di risolvere facendo alcuni passaggi.


3

se hai a che fare con l'aggiornamento di iOS5, ho scoperto che per la compilazione di un progetto scritto sulla destinazione 4.3, potevo semplicemente rinominare libz.1.2.3.dynlib nel Navigatore del progetto in libz.1.2.5.dynlib e compilato.

La mia cartella iPhoneOS50SDK / usr / lib non ha libz.1.2.3.dynlib - non so se è una cosa beta o solo un aggiornamento naturale.


3

Vai al tuo progetto, fai clic su Crea fasi, Compila fonti, Aggiungi GameCenterManager.m all'elenco.


3

Probabilmente mancano alcune classi dal tuo obiettivo. Questo di solito accade quando rinomini / rimuovi / aggiungi nuovi file di classi al tuo progetto. Per correggere aggiungere le nuove classi aggiunte ad alcuni target.

Seleziona la classe nel Navigatore progetto (barra laterale destra), apri la barra laterale Utilità (barra laterale destra), da Utilità seleziona Impostazioni file (icona simile a un file), sotto la scheda Iscrizione target, spunta i tuoi obiettivi. Tutto ciò per evitare il "Rimuovi riferimento" e aggiungerlo nuovamente con il segno di spunta "Aggiungi ai target".

Quindi: Seleziona Classe -> Utilità (File Inspector) -> Target Membership -> Seleziona gli obiettivi che desideri.


2

Non ho trovato questo suggerimento qui, quindi eccolo qui: se il tuo progetto ha più di un target (cioè uno per OSX e uno per iOS), devi collegare le librerie pertinenti per ciascun target .. quindi, per esempio, nel mio caso io necessario AudioToolbox .. Ho dovuto aggiungerlo una volta per OSX e una volta per iOS (sotto la cartella frameworks , devi avere un duplicato di ogni libreria per ogni target .. se ne vedi solo uno .. allora è una bandiera rossa)


Questa risposta mi ha aiutato. Tuttavia, la mia situazione era ancora più semplice ... Ho semplicemente dimenticato di aggiungere un framework a cui faceva riferimento la mia base di codice. Nel mio caso non sono riuscito a caricare AVFoundation.framework.
John Erck,

Sì, ho semplicemente dimenticato di aggiungere un framework nella fase "Link Binary with Libraries".
Max

2

Stavo affrontando un problema con le librerie PJSIP,

Ho provato quanto segue in altri flag linker nel progetto e in grado di risolvere l'errore: -framework Foundation -framework UIKit

I flag linker sopra sono usati in Siphone Project su github . Queste impostazioni ti aiuteranno a risolvere i problemi relativi al collegamento delle librerie C ++.


Sto riscontrando lo stesso problema con i librabries PJSIP, puoi spiegare la soluzione in dettaglio
Rajat Jain,

Imposta i seguenti valori in altri flag linker dell'impostazione di creazione del progetto: -framework Foundation -framework UIKit
Adeesh Jain

Messaggio di errore: ignorando il file /Users/user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a, il file è stato creato per l'archivio che non è l'architettura da collegare (i386): / Users /user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a Simboli indefiniti per l'architettura i386: "_pjsip_register_method", referenziato da:
Rajat Jain

Sembra che tu stia provando a eseguire l'app sul simulatore e libyuv.a non è costruito per l'architettura simulatore i386. prova a eseguire direttamente l'app sul dispositivo
Adeesh Jain,

Voglio integrare Pjsip in Swift. Ho provato a creare intestazioni ponte ma non ha funzionato. Puoi darmi qualche idea?
Rajat Jain,

1

Alla fine l'ho capito, ho risolto questo problema aggiungendo un framework assente al target-> Build Phases-> Link Binary With Libraries


1

Una volta ho avuto questo problema. Mi sono reso conto che durante lo spostamento di una classe, avevo sovrascritto il .mmfile con il .hfile nella cartella di destinazione.

Risolvere il problema risolto l'errore.


1

Ho ricevuto l'errore "Simboli indefiniti per l'architettura armv7:" durante il tentativo di compilare un progetto che aveva l'impostazione di creazione di destinazione per "Libreria standard C ++" impostata su "libc ++" (necessario poiché il progetto utilizzava alcune funzionalità di C ++ 11) e il progetto includeva un sottoprogetto con la stessa impostazione impostata su "libstdc ++" (o impostazione predefinita del compilatore come è attualmente).

La modifica dell'impostazione 'Libreria standard C ++' del sottoprogetto su libc ++ l'ha risolto, ma solo dopo aver prima impostato la destinazione di distribuzione per il sottoprogetto su 5.0 o versioni successive (5.0 è necessario per libc ++).


1

Ti do più suggerimenti che puoi verificare quando altri suggerimenti comuni non sono di aiuto.

Se ti colleghi ad un altro progetto (libxxx.a), a volte potresti incontrare strani problemi che puoi trovare il simbolo con strumenti come nm ma semplicemente non riescono a trovare i simboli in ld. Quindi è necessario verificare se i due progetti sono creati negli stessi flag, alcuni di essi potrebbero influire sul formato binario.

  1. controlla il compilatore c ++.
  2. controlla l'impostazione dialettale c ++.
  3. controllare il supporto del tipo di runtime c ++. (-Frtti / -fnortti)
  4. controlla se c'è un .a con lo stesso nome visualizzato altrove, potrebbe essere oltre il file desiderato nell'elenco dei percorsi dei collegamenti. rimuovili.

1

Ho riscontrato questo problema quando eseguo app su iPhone5s , è stato risolto aggiungendo arm64 a Architectures .


1

Ho avuto lo stesso problema. Ho provato di tutto dall'enorme elenco di risposte, ma alla fine il mio problema era: sto lavorando con openCV, quindi ho bisogno di combinare il codice C ++ nel mio codice. Per fare questo, dovresti cambiare i file che usano object-c e C ++ in .mm. Non ho cambiato un file e questo file non ha alcuna connessione con il codice C ++ ma ho dovuto cambiarlo.


1

Ho riscontrato questo problema durante l'installazione di shareKit. Ha funzionato nel simulatore, ma non sul dispositivo. Ho rimosso -all_load dall'altro linker flag e tutto funziona bene sia nel simulatore che nel dispositivo iphone.


1

Nel mio caso, ho aggiunto un framework che deve utilizzare Objective C ++. Ho trovato questo post:

XCode .m vs. .mm

questo ha spiegato come il main.m doveva essere rinominato in main.mm in modo che anche le classi Objective-C ++ potessero essere compilate.

Ciò ha risolto il problema per me.



1

Per me il problema era che ho dimenticato di impostare il valore per le mie costanti in .m (implementazione)

file const kFooKey = @"Foo";

1

Ho anche aggiunto file tramite trascinamento. Ciò che ho fatto, ho rimosso i riferimenti di tutti i file (escluso frameworks), quindi li ho aggiunti di nuovo correttamente tramite l' opzione Aggiungi file al progetto , problema risolto.


1

Se stai compilando da Unity3D 5 e utilizzi anche un plug-in Prime31 e ricevi questo errore, probabilmente è dovuto a una DLL duplicata. Se guardi i tuoi avvertimenti nell'editor di Unity, uno di loro ti dirà questo e avvertirà che potrebbe causare errori di compilazione. Per vedere se questo è il caso, digita P31 nel campo di ricerca del tuo progetto e dovrebbe apparire, forse anche più di uno. I duplicati avranno un '1' alla fine del nome del file. Ciò è probabilmente dovuto all'aggiornamento del plugin nell'editor tramite l'archivio o la scheda del menu Prime31.

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.