[C++] Linux: Problème de linkage [niveau BTS]
Résolu/Fermé
GafouZ
Messages postés
15
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
26 octobre 2009
-
22 mars 2007 à 10:11
GafouZ Messages postés 15 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 26 octobre 2009 - 22 mars 2007 à 19:49
GafouZ Messages postés 15 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 26 octobre 2009 - 22 mars 2007 à 19:49
A voir également:
- [C++] Linux: Problème de linkage [niveau BTS]
- Émulateur linux ✓ - Forum Linux / Unix
- Linux su - Astuces et Solutions
- Outlook linux - Forum Linux / Unix
- Gunzip linux - Astuces et Solutions
- Dezipper linux - Astuces et Solutions
8 réponses
Stupeflip
Messages postés
391
Date d'inscription
jeudi 8 février 2007
Statut
Membre
Dernière intervention
4 décembre 2007
94
22 mars 2007 à 10:27
22 mars 2007 à 10:27
Salut,
Je pense qu'il faut que tu inclues ton Robulab.cpp dans ton ServeurTCP9988.o. Si jamais ça te met des erreurs de redéfinition, tu peux créer un Robulab.h contenant tous les prototypes des fonctions de Robulab.c et mettre un #ifndef avec #include "Robulab.h" dans ton ServeurTCP9988.c.
Oublie pas le -lpthread pour le multithread ^^
Je pense qu'il faut que tu inclues ton Robulab.cpp dans ton ServeurTCP9988.o. Si jamais ça te met des erreurs de redéfinition, tu peux créer un Robulab.h contenant tous les prototypes des fonctions de Robulab.c et mettre un #ifndef avec #include "Robulab.h" dans ton ServeurTCP9988.c.
Oublie pas le -lpthread pour le multithread ^^
GafouZ
Messages postés
15
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
26 octobre 2009
22 mars 2007 à 10:35
22 mars 2007 à 10:35
J'ai essayé d'inclure Robulab.c dans serveur.o mais il me dit encre des erreurs de redéfinition...
C'est quoi exactement ces erreurs là?
Et pourquoi le "#ifndef" ?
Le truc c'est que j'ai seulment 1 classe avec 4/5 fonctions, à coté de cela j'ai 3 fonctions et 2 structures et il me faut que tout cela soit dans le même .h!!
Donc refaire un Robulab.h euh....
Ah Oui le "-lpthread" je ne l'ai pas encore mis car je ne gère pas le multithreading ! J'ai mis toute cette partie en commentaire justement car elle n'est pas fini !
Maintenant j'obtient:
$ make
g++ -o RobuSimul.o -c RobuSimul.cpp -Wall -ansi
g++ -o Robulab.o -c Robulab.cpp -Wall -ansi
g++ -o ServeurTCP9988.o ServeurTCP9988.cpp Robulab.cpp
/home/bryc/tmp/ccYL0HHS.o: In function `main':
Robulab.cpp:(.text+0x40): undefined reference to `RobuSimul::RobuInit(Coordonnees&)'
Robulab.cpp:(.text+0xd7): undefined reference to `RobuSimul::EnAvantRobuLab(LAB80FeedbackStruct&, RobuSimul&, Coordonnees)'
Robulab.cpp:(.text+0xdc): undefined reference to `ServeurTCP9988()'
Robulab.cpp:(.text+0xe6): undefined reference to `ClientTCP()'
collect2: ld returned 1 exit status
make: *** [ServeurTCP9988.o] Erreur 1
Merci de ton aide !
C'est quoi exactement ces erreurs là?
Et pourquoi le "#ifndef" ?
Le truc c'est que j'ai seulment 1 classe avec 4/5 fonctions, à coté de cela j'ai 3 fonctions et 2 structures et il me faut que tout cela soit dans le même .h!!
Donc refaire un Robulab.h euh....
Ah Oui le "-lpthread" je ne l'ai pas encore mis car je ne gère pas le multithreading ! J'ai mis toute cette partie en commentaire justement car elle n'est pas fini !
Maintenant j'obtient:
$ make
g++ -o RobuSimul.o -c RobuSimul.cpp -Wall -ansi
g++ -o Robulab.o -c Robulab.cpp -Wall -ansi
g++ -o ServeurTCP9988.o ServeurTCP9988.cpp Robulab.cpp
/home/bryc/tmp/ccYL0HHS.o: In function `main':
Robulab.cpp:(.text+0x40): undefined reference to `RobuSimul::RobuInit(Coordonnees&)'
Robulab.cpp:(.text+0xd7): undefined reference to `RobuSimul::EnAvantRobuLab(LAB80FeedbackStruct&, RobuSimul&, Coordonnees)'
Robulab.cpp:(.text+0xdc): undefined reference to `ServeurTCP9988()'
Robulab.cpp:(.text+0xe6): undefined reference to `ClientTCP()'
collect2: ld returned 1 exit status
make: *** [ServeurTCP9988.o] Erreur 1
Merci de ton aide !
Stupeflip
Messages postés
391
Date d'inscription
jeudi 8 février 2007
Statut
Membre
Dernière intervention
4 décembre 2007
94
22 mars 2007 à 10:41
22 mars 2007 à 10:41
En fait les erreurs de redéfinition sont 'normales' dans la mesure où deux .c vont s'appeler l'un l'autre. C'est pourquoi un #ifndef est utile. En gros ça ferait ici : if not define so include, c'est pourquoi je t'avais proposé un .h ne contenant que les prototypes des fonctions du .c de ton main (tu peux le faire dans l'autre sens aussi). En pratique tu peux faire :
Si tu as un #define dans ton programme, utilise le comme test, sinon tu en crées un pour le test ^^
Si tu as un #define dans ton programme, utilise le comme test, sinon tu en crées un pour le test ^^
#ifndef CONSTANTE_TEST #include ton_fichier.h #endifSi ta constante n'est pas définie, alors il va include ton .h avec les prototypes et ça sera bon, sinon il ne fera rien. Ca te permet d'éviter les redéfinitions.
GafouZ
Messages postés
15
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
26 octobre 2009
22 mars 2007 à 10:50
22 mars 2007 à 10:50
RE:
J'essayerai ce soir et je vous tiendrais au courant! Là je suis obliger d'aller en cour !
Merci pour tout !
Bonne journée !
J'essayerai ce soir et je vous tiendrais au courant! Là je suis obliger d'aller en cour !
Merci pour tout !
Bonne journée !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 328
22 mars 2007 à 14:52
22 mars 2007 à 14:52
à mon avis, il manque simlpement l'option -c à la dernière compilation, d'où l'erreur de ld qui n'aurai même pas du être appeler à ce niveau là.
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 328
22 mars 2007 à 14:59
22 mars 2007 à 14:59
re, j'avais pas lu le reste.
Reviens au premier message, il suffisait de rajouter le "-c".
Maintenant, tu n'as pas de problème de redéfinition, tu a un problème de définition :
"undefined reference"
veux dire que ta fonction n'est pas défini, qu'il ne la trouve pas, qu'elle n'existe pas.
Encore une foi, c'est un problème à l'édition des liens, pas à la compilation, donc rien ne sert de tripatouiller les .h
Reviens au premier message, il suffisait de rajouter le "-c".
Maintenant, tu n'as pas de problème de redéfinition, tu a un problème de définition :
"undefined reference"
veux dire que ta fonction n'est pas défini, qu'il ne la trouve pas, qu'elle n'existe pas.
Encore une foi, c'est un problème à l'édition des liens, pas à la compilation, donc rien ne sert de tripatouiller les .h
mamiemando
Messages postés
32283
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
17 mars 2023
7 572
22 mars 2007 à 16:04
22 mars 2007 à 16:04
Pourquoi ne pas s'inspirer d'un makefile générique qui t'éviterait d'avoir à écrire les dépendances à la main ?
http://www.apc.univ-paris7.fr/~beau/article.php3?id_article=36
A noter qu'on inclu JAMAIS un fichier de source (.cpp, .c, .cc, .cxx...). Les seules chose que tu peux inclure sont les headers (.hpp, .h, .hh, .hxx...) et les définitions de templates (.tcc).
A noter que si tu implémentes (au lieu de seulement déclarer) une fonction dans un header, celle-ci doit impérativement être inline (sinon tu risques d'avoir des redefinitions si ce fichier est inclu à plusieurs endroits).
Bonne chance
http://www.apc.univ-paris7.fr/~beau/article.php3?id_article=36
A noter qu'on inclu JAMAIS un fichier de source (.cpp, .c, .cc, .cxx...). Les seules chose que tu peux inclure sont les headers (.hpp, .h, .hh, .hxx...) et les définitions de templates (.tcc).
A noter que si tu implémentes (au lieu de seulement déclarer) une fonction dans un header, celle-ci doit impérativement être inline (sinon tu risques d'avoir des redefinitions si ce fichier est inclu à plusieurs endroits).
Bonne chance
GafouZ
Messages postés
15
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
26 octobre 2009
22 mars 2007 à 19:49
22 mars 2007 à 19:49
Merci à vous!
J'ai resolu le problème !
Comme vous le dites Char Snipeur j'avais tout simplement oublier le -c et ca a peut près marché !
En fin de compte j'ai fini par faire un .cpp = un .h cela m'a simplifer le tout !
Merci mamiemando je vais re regarder cela de plus près.
Merci encore !
J'ai d'autres problèmes mais je ne les posterai pas ici parce qu'ils ne consernent en rien ce sujet !
Bne soirée!
J'ai resolu le problème !
Comme vous le dites Char Snipeur j'avais tout simplement oublier le -c et ca a peut près marché !
En fin de compte j'ai fini par faire un .cpp = un .h cela m'a simplifer le tout !
Merci mamiemando je vais re regarder cela de plus près.
Merci encore !
J'ai d'autres problèmes mais je ne les posterai pas ici parce qu'ils ne consernent en rien ce sujet !
Bne soirée!