Problema del encabezado C:#include y "referencia indefinida"
gcc header (5)
Debe vincular el archivo del objeto completado desde su segundo archivo .c hello_world.c con su main.o
prueba esto
cc -c main.c
cc -c hello_world.c
cc *.o -o hello_world
Bien, he tratado de trabajar con esto por mucho tiempo, y parece que no puedo hacer que funcione bien. 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é ...
Aquí están mis archivos fuente. Primero 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 pongo en GCC, esto es lo que 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 capaz de ayudarme? Estoy realmente atrapado en esto, pero estoy 99 por ciento seguro de que es una solución realmente simple.
No está incluyendo hello_world.c en compilación.
gcc hello_world.c main.c -o main
Parece que has olvidado vincular hello_world.c. 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.
Usted no está enlazando contra hello_world.c.
Una forma fácil de hacerlo es ejecutar este comando de compilación:
cc -o main main.c hello_world.c
Los proyectos más complicados a menudo usan scripts de construcción o crean archivos que separan los comandos de compilación y vinculación, pero el comando anterior (que combina ambos pasos) debería funcionar bien para proyectos pequeños.
gcc main.c hello_world.c -o main
Además, siempre use protectores de encabezado:
#ifndef HELLO_WORLD_H
#define HELLO_WORLD_H
/* header file contents go here */
#endif /* HELLO_WORLD_H */