2012-04-27 9 views
16

Muy bien, he estado tratando de trabajar con esto durante más tiempo, y parece que no puedo hacer que funcione correctamente. Tengo tres archivos, main.c, hello_world.c y hello_world.h. Por alguna razón, no parecen compilar muy bien, y realmente no puedo entender por qué ...C problema del encabezado: #include y "referencia indefinida"

Aquí están mis archivos fuente. En primer lugar hello_world.c:

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

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

Entonces hello_world.h, simple:

int hello_world(void); 

Y, finalmente, main.c:

#include "hello_world.h" 

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

Cuando lo puse en GCC, esto es lo Obtengo:

 
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 

¿Alguien me puede ayudar? Estoy realmente atrapado en esto, pero estoy 99 por ciento seguro de que es una solución realmente simple.

Respuesta

35
gcc main.c hello_world.c -o main 

También, utilice siempre protectores de cabecera:

#ifndef HELLO_WORLD_H 
#define HELLO_WORLD_H 

/* header file contents go here */ 

#endif /* HELLO_WORLD_H */ 
+1

Gracias! Una de esas pequeñas cosas que hacen tropezar a los programadores. :) – user1018501

+1

Aunque los protectores de encabezado son innecesarios (en este ejemplo) es una buena pista – KevinDTimm

+1

@ user1018501: Si esta respuesta resolvió su problema, debe aceptarlo. – Job

3

Debe vincular fichero objeto compled de su segundo hello_world.c archivo .c con su main.o

probar esto

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

Usted no está incluyendo hello_world.c en la compilación.

gcc hello_world.c main.c -o main 
4

Usted no está enlazando contra hello_world.c.

Una manera fácil de hacer esto es ejecutar este comando de compilación:

proyectos

cc -o main main.c hello_world.c

más complicadas suelen utilizar scripts de creación o hacer que los archivos que separan los comandos de compilación y enlace, pero el comando anterior (combinando ambos pasos) debería funcionar bien para proyectos pequeños.

+0

Sí, definitivamente debes aprender sobre 'make' (o mejores sistemas de construcción, como' omake') –

1

Ya parece que ha olvidado vincular hello_world.c. Voy a ser gcc hello_world.c main.c -o main. Si la cantidad de archivos es menor, podemos utilizar este enfoque, pero en proyectos más grandes, es mejor utilizar archivos Make o algunos scripts de compilación.

Cuestiones relacionadas