2012-04-27 18 views
16

Va bene, ho cercato di lavorare con questo per il tempo più lungo, e semplicemente non riesco a farlo funzionare correttamente. Ho tre file, main.c, hello_world.c e hello_world.h. Per qualche ragione non sembrano compilare bene, e davvero non riesco a capire perché ...Problema dell'intestazione C: #include e "riferimento non definito"

Ecco i miei file sorgente. Prima hello_world.c:

#include <stdio.h> 
#include "hello_world.h" 

int hello_world(void) { 
    printf("Hello, Stack Overflow!\n"); 
    return 0; 
} 

Poi hello_world.h, semplice:

int hello_world(void); 

E poi finalmente main.c:

#include "hello_world.h" 

int main() { 
    hello_world(); 
    return 0; 
} 

Quando ho messo in GCC, questo è ciò che Ottengo:

 
cc  main.c -o main 
/tmp/ccSRLvFl.o: In function `main': 
main.c:(.text+0x5): undefined reference to `hello_world' 
collect2: ld returned 1 exit status 
make: *** [main] Error 1 

Chiunque può darmi una mano? Sono davvero bloccato su questo, ma sono sicuro al 99% che sia una soluzione davvero semplice.

risposta

35
gcc main.c hello_world.c -o main 

Inoltre, utilizzare sempre le guardie di intestazione:

#ifndef HELLO_WORLD_H 
#define HELLO_WORLD_H 

/* header file contents go here */ 

#endif /* HELLO_WORLD_H */ 
+1

Grazie! Una di quelle piccole cose che fanno scattare i programmatori. :) – user1018501

+1

Anche se le protezioni dell'intestazione non sono necessarie (in questo esempio) è un buon suggerimento – KevinDTimm

+1

@ user1018501: Se questa risposta ha risolto il tuo problema, dovresti accettarlo. – Job

3

Si dovrebbe collegare file oggetto compled dal secondo hello_world.c file .c con il main.o

provare questo

cc -c main.c 
cc -c hello_world.c 
cc *.o -o hello_world 
8

Non si include hello_world.c nella compilazione.

gcc hello_world.c main.c -o main 
4

Non si sta collegando a hello_world.c.

Un modo semplice per farlo è quello di eseguire questo comando compilazione:

progetti

cc -o main main.c hello_world.c

più complesse spesso usano creare script o rendere i file che separano i comandi di compilazione e di collegamento, ma il comando precedente (che unisce entrambi i passaggi) dovrebbe andare bene per piccoli progetti.

+0

Sì, dovresti sicuramente conoscere 'make' (o meglio i sistemi di costruzione, come' omake') –

1

Ya sembra che tu abbia dimenticato di collegare hello_world.c. Sarò gcc hello_world.c main.c -o main. Se il numero di file è inferiore, possiamo usare questo approccio, ma in progetti più grandi è meglio usare Make files o alcuni script di compilazione.

Problemi correlati