web-dev-qa-db-fra.com

Problème d'en-tête C: #include et "référence non définie"

D'accord, j'essaie de travailler avec cela depuis le plus longtemps, et je n'arrive tout simplement pas à le faire fonctionner correctement. J'ai trois fichiers, main.c, hello_world.c, et hello_world.h. Pour une raison quelconque, ils ne semblent pas bien compiler, et je ne peux vraiment pas comprendre pourquoi ...

Voici mes fichiers sources. Premier hello_world.c:

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

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

Alors bonjour_world.h, simple:

int hello_world(void);

Et puis enfin main.c:

#include "hello_world.h"

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

Quand je le mets dans GCC, voici ce que j'obtiens:

 cc main.c -o main 
/tmp/ccSRLvFl.o: Dans la fonction `main ': 
 main.c :(. text + 0x5): référence non définie à` hello_world '
 collect2: ld a renvoyé 1 état de sortie 
 make: *** [main] Erreur 1 

Quelqu'un peut-il m'aider? Je suis vraiment coincé là-dessus, mais je suis sûr à 99% que c'est une solution très simple.

19
user1018501
gcc main.c hello_world.c -o main

En outre, utilisez toujours des protecteurs d'en-tête:

#ifndef HELLO_WORLD_H
#define HELLO_WORLD_H

/* header file contents go here */

#endif /* HELLO_WORLD_H */
38
Lundin

Vous n'incluez pas hello_world.c dans la compilation.

   gcc hello_world.c main.c   -o main
8
P.P.

Vous ne liez pas contre hello_world.c.

Un moyen simple de le faire est d'exécuter cette commande de compilation:

cc -o main main.c hello_world.c

Les projets plus compliqués utilisent souvent des scripts de construction ou créent des fichiers qui séparent les commandes de compilation et de liaison, mais la commande ci-dessus (combinant les deux étapes) devrait convenir aux petits projets.

5
Tom

Vous devez lier le fichier objet complété à partir de votre deuxième fichier .c hello_world.c avec votre main.o

essaye ça

cc -c main.c
cc -c hello_world.c
cc *.o -o hello_world
4
vard

Oui, il semble que vous ayez oublié de lier hello_world.c. Je serai gcc hello_world.c main.c -o main. Si le nombre de fichiers est inférieur, nous pouvons utiliser cette approche, mais dans les grands projets, il vaut mieux utiliser des fichiers Make ou certains scripts de compilation.

1
john