C ++: Liaison de fichiers avec le compilateur GCC

J’ai trois fichiers: myh.h; my.cpp; use.cpp. Voici le contenu des fichiers:

myh.h

extern int foo; void print_foo(); void print(int); 

mon.cpp

 #include "myh.h" #include  void print_foo() { std::cout<<foo<<std::endl; } void print(int i) { std::cout<<i<<std::endl; } 

use.cpp

 #include "myh.h" int main() { foo=7; print_foo(); print(99); return 0; } 

GCC crache l’erreur suivante:

 my.o:my.cpp:(.text+0x7): undefined reference to `foo' use.o:use.cpp:(.text+0x10): undefined reference to `foo' collect2: ld returned 1 exit status 

Je comstack les fichiers à l’aide de la commande -c et elle ne génère pas d’erreur. Je lie en utilisant la commande suivante:

 g++ -o final my.o use.o 

Quel est le problème ici, je lis d’autres sujets avec des problèmes similaires, et le cas ici est juste étrange …..

Pour les curieux, cet exercice est tiré du livre de Stroustrup intitulé Principes de programmation pour utiliser le C ++.

Edit: j’ai fait comme dit dasblinkenlight, et dans use.cpp, j’ai ajouté un int devant foo (donc foo est défini), mais j’obtiens toujours cette erreur:

 my.o:my.cpp:(.text+0x7): undefined reference to `foo' collect2: ld returned 1 exit status 

Ce qui me dit qu’il n’est pas défini dans my.cpp également? Si je dois le définir partout, à quoi sert-il de l’inclure dans le fichier d’en-tête ou comment faut-il l’aborder de manière plus appropriée?

Vous obtenez une erreur de l’éditeur de liens car vous avez déclaré foo , mais vous ne l’avez jamais défini .

extern int foo n’est qu’une déclaration; cela n’entraîne pas d’allocation de mémoire pour la variable foo , mais seulement que vous le ferez ailleurs. Pour résoudre ce problème, vous devez append cette ligne à l’un des fichiers cpp, comme ceci:

 #include "myh.h" int foo; int main() { foo=7; print_foo(); print(99); return 0; } 

Le problème est que foo est déclaré mais pas défini. Vous devez définir foo dans exactement l’une des unités de traduction, par exemple:

 int foo = 0;