2011-08-16 7 views
5
/me/home/file1.c containes function definition: 

int mine(int i) 
{ 
    /* some stupidity by me */ 
} 

ho dichiarato questa funzione inutilizzando una funzione in diversi file .c (c programmazione 101)

/me/home/file1.h 

int mine(int); 

se voglio utilizzare questa funzione mine() in /me/home/at/file2.c

Per farlo , tutto quello che devo fare è:

file2.c 

#include "../file1.h" 

È sufficiente? Probabilmente no.

Dopo aver fatto questo molto, quando compilo file2.c, ottengo undefined reference to 'mine'

risposta

6

È inoltre necessario collegare il file oggetto dal file1. Esempio:

gcc -c file2.c 
gcc -c ../file1.c 
gcc -o program file2.o file1.o 

Oppure si può anche nutrire tutti i file contemporaneamente e lasciare che GCC fare il lavoro (non suggerito al di là di una manciata di file);

gcc -o program file1.c file2.c 
+0

Grazie Yann. Come posso farlo in un Makefile? – hari

+1

In genere, è possibile farla franca specificando solo i file oggetto e GCC è abbastanza intelligente da fare il resto. I.e .: 'programma: file1.o file2.o \ n \ tgcc -o programma file1.o file2.o' –

+0

Grazie mille per l'aiuto rapido. – hari

1

Non utilizzare ../ in un'intestazione. Invece, istruire gcc di utilizzare la directory padre come percorso di inclusione:

(nella directory a):

gcc -I../ -c file2.c 
+0

A volte ci sono buone ragioni per non fare -I ../, non andrei così lontano da dire "non usare ../" è una buona regola generale. – George

1

Dopo aver fatto questo molto, quando compilo file2.c, ottengo undefined reference to 'mine'

No, non è così. Non è la compilazione che causa quegli errori. È quest'altra cosa, chiamata "collegamento".

Il compilatore compila una "unità di traduzione" - il risultato dell'esecuzione del preprocessore su un file sorgente, possibilmente inserendo più elementi tramite #include - alla volta, e quindi il linker li mette insieme per fare un eseguibile. In genere, lo stesso programma funge sia dal compilatore che dal linker, con diversi flag, e in genere puoi dire di fare tutto in una volta (e non salvare alcun file temporaneo per le unità di traduzione compilate). Ma hai bisogno di dirgli cosa collegare, e hai bisogno di compilare tutto ciò che sarà collegato.

+0

Grazie per la risposta dettagliata. – hari

Problemi correlati