2014-12-22 10 views
5

Sto scrivendo un'applicazione con più sottodirectory. Ho creato una struttura Makefile in modo tale che le sottodirectory compilino il file e facciano "ar rvs" e "ranlib libxxx.a" per creare archivi nella directory superiore per il collegamento.Gcc su OS X: simboli non definiti per l'architettura x86_64

Tuttavia, il comando "ld" sta eseguendo il seguente problema.

ld: warning: ignoring file ./libxxx.a, file was built for archive which is not 
the architecture being linked (x86_64): 
./libxxx.a Undefined symbols for architecture x86_64: 

Sto usando gcc su Mac OS X 10.10.1

ho letto molti messaggi su questo. Ho provato "gcc -arch i386", poi ho incontrato lo stesso errore per i386

Undefined symbols for architecture i386: 

ho installato gcc-4.9.2 ed ho provato ad usarlo al posto del gcc di default, senza fortuna. Ho provato a usare x86_64-apple-darwin14.0.0-g ++ - 4.9.2 e questo non è stato d'aiuto.

risposta

1

Gli errori che stai vedendo significano che hai una miscela di codice i386 e x86_64 nella compilazione, e devi essere coerente. A meno che non ci sia un motivo convincente per fare altrimenti (sarei curioso di sapere di cosa si tratta), dovresti compilare tutto solo per 64 bit. L'utilizzo di gcc su Mac, che è normalmente l'impostazione predefinita, ma è possibile forzarlo aggiungendo un flag -m64 alle compilation. Un modo per farlo è impostare CC="gcc -m64" sulla riga di comando make; ci sono anche altri modi migliori, ma i dettagli dipendono dal tuo contenuto di makefile.

Per risolvere: in primo luogo, rimuovere tutte le librerie e il codice oggetto che è stato creato nell'area del progetto (potrebbe farlo make clean se si è scritto un obiettivo clean). Quindi, impostare il valore di CC oi relativi flag (CFLAGS alla fine, ma la modalità di creazione di CFLAGS dipende dallo makefile in modo da applicare la compilazione a 64 bit. Quindi assicurati di utilizzarlo in tutte le compilation. Se non vedi lo -m64, hai un problema.

Se è necessario utilizzare 32 bit, sostituire -m32 per -m64.

La discussione sopra riportata presuppone che si stia utilizzando gcc per eseguire il comando ld. Se non lo sei, sei da solo finché non usi gcc per eseguire il comando ld. Dal mio punto di vista, hai cose migliori da fare con la tua vita piuttosto che capire come eseguire correttamente il comando ld; Ho certamente.

+0

Grazie per la risposta. Ho provato "CC = gcc -m64" e ho anche usato gcc per eseguire il comando ld.Ma il risultato è lo stesso. Ho solo provato l'opzione -m32 per vedere se funziona se lo rendo coerente, ma per nessun altro motivo. – newprogrammer

+0

Nessuno può aiutarti molto di più se non vediamo un makefile minimale che riproduce il problema. Leggi come creare un MCVE ([Come creare un esempio minimo, completo e verificabile?] (Http://stackoverflow.com/help/mcve)) o SSCCE ([Esempio coretto, autocontenuto, corretto] (http://sscce.org/)) - due nomi e collegamenti per la stessa idea. Il codice MCVE dovrebbe essere probabilmente un file sorgente minimo (e intestazione) per la libreria ('void libfunc (void) {printf ("% s chiamato \ n ", __func__);}', e il tuo programma principale che chiama la funzione di libreria, più uno o due makefile a seconda di come sono disposte le cose: –

+0

Grazie. – newprogrammer

Problemi correlati