[C++] Linux: Problème de linkage [niveau BTS]
Résolu
GafouZ
Messages postés
15
Date d'inscription
Statut
Membre
Dernière intervention
-
GafouZ Messages postés 15 Date d'inscription Statut Membre Dernière intervention -
GafouZ Messages postés 15 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Voilà, cela fait un petit bout de temps que je scrute votre site et forum que je trouve très complet. Aujour'hui je me suis lancé et je me suis inscrit. Mais voilà je suis désolé de solicité votre aide...
Dans le cadre de mon projet de BTS j'ai du notament créer un serveur et un client TCP simple pour le moment.
Mais voilà aujourd'hui toutes les petites parties de mon projet sont faite et il me faut les assembler.
Mais voilà ca ne marche pas et ca fait 2jours que je galère!
Le client et le serveur marchaient très bien séparéments.
J'ai un autre .cpp nommé RobuSimul.cpp qui ne fais que du calcul.
Je n'est qu'un seul .h qui rassemble toutes mes déclarations vu qu'il n'y en a pas tant que cela et que je n'est que deux classes.
Le tout marchera en multithreading...
Aujourd'hui j'ai voulu rassembler ces fichiers mais sans faire appel à toutes les fonctions et sans le multithreading cela devrait compiler et linker.
Sachant que le main est dans Robulab.cpp!
Au total j'ai donc:
Robulab.cpp, RobuSimul.cpp, ServeurTPC.cpp ClientTCP.cpp et mon header RobuSimul.h
pour compiler je fais :
essai: RobuSimul.o Robulab.o ServeurTCP9988.o ServeurTCP9999.o ClientTCP.o
g++ -o essai RobuSimul.o Robulab.o ServeurTCP9988.o ServeurTCP9999.o ClientTCP.o
RobuSimul.o: RobuSimul.cpp RobuSimul.h
g++ -o RobuSimul.o -c RobuSimul.cpp -Wall -ansi
Robulab.o: Robulab.cpp RobuSimul.h
g++ -o Robulab.o -c Robulab.cpp -Wall -ansi
ServeurTCP9988.o: ServeurTCP9988.cpp RobuSimul.h
g++ -o ServeurTCP9988.o ServeurTCP9988.cpp
ServeurTCP9999.o: ServeurTCP9999.cpp RobuSimul.h
g++ -o ServeurTCP9988.o ServeurTCP9999.cpp
ClientTCP.o: ClientTCP.cpp RobuSimul.h
g++ -o ClientTCP.o ClientTCP.cpp
Mais voilà à la sortie j'ai :
[????@localhost SimulRobu]$ 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
/usr/lib/gcc/i586-mandriva-linux-gnu/4.1.1/../../../crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [ServeurTCP9988.o] Erreur 1
je ne trouve pas du tout !
J'ai déja essayé beaucoup de choses, au niveau des headers, notament avec iotream et d'aitre, des options de compilation, de la redefintions de certaines fonctions mais au moment du linkage rien a faire !
Merci de votre aide je suis vraiment ouvert à toutes les solutions!
Voilà, cela fait un petit bout de temps que je scrute votre site et forum que je trouve très complet. Aujour'hui je me suis lancé et je me suis inscrit. Mais voilà je suis désolé de solicité votre aide...
Dans le cadre de mon projet de BTS j'ai du notament créer un serveur et un client TCP simple pour le moment.
Mais voilà aujourd'hui toutes les petites parties de mon projet sont faite et il me faut les assembler.
Mais voilà ca ne marche pas et ca fait 2jours que je galère!
Le client et le serveur marchaient très bien séparéments.
J'ai un autre .cpp nommé RobuSimul.cpp qui ne fais que du calcul.
Je n'est qu'un seul .h qui rassemble toutes mes déclarations vu qu'il n'y en a pas tant que cela et que je n'est que deux classes.
Le tout marchera en multithreading...
Aujourd'hui j'ai voulu rassembler ces fichiers mais sans faire appel à toutes les fonctions et sans le multithreading cela devrait compiler et linker.
Sachant que le main est dans Robulab.cpp!
Au total j'ai donc:
Robulab.cpp, RobuSimul.cpp, ServeurTPC.cpp ClientTCP.cpp et mon header RobuSimul.h
pour compiler je fais :
essai: RobuSimul.o Robulab.o ServeurTCP9988.o ServeurTCP9999.o ClientTCP.o
g++ -o essai RobuSimul.o Robulab.o ServeurTCP9988.o ServeurTCP9999.o ClientTCP.o
RobuSimul.o: RobuSimul.cpp RobuSimul.h
g++ -o RobuSimul.o -c RobuSimul.cpp -Wall -ansi
Robulab.o: Robulab.cpp RobuSimul.h
g++ -o Robulab.o -c Robulab.cpp -Wall -ansi
ServeurTCP9988.o: ServeurTCP9988.cpp RobuSimul.h
g++ -o ServeurTCP9988.o ServeurTCP9988.cpp
ServeurTCP9999.o: ServeurTCP9999.cpp RobuSimul.h
g++ -o ServeurTCP9988.o ServeurTCP9999.cpp
ClientTCP.o: ClientTCP.cpp RobuSimul.h
g++ -o ClientTCP.o ClientTCP.cpp
Mais voilà à la sortie j'ai :
[????@localhost SimulRobu]$ 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
/usr/lib/gcc/i586-mandriva-linux-gnu/4.1.1/../../../crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [ServeurTCP9988.o] Erreur 1
je ne trouve pas du tout !
J'ai déja essayé beaucoup de choses, au niveau des headers, notament avec iotream et d'aitre, des options de compilation, de la redefintions de certaines fonctions mais au moment du linkage rien a faire !
Merci de votre aide je suis vraiment ouvert à toutes les solutions!
A voir également:
- [C++] Linux: Problème de linkage [niveau BTS]
- Linux reader - Télécharger - Stockage
- Toutou linux - Télécharger - Systèmes d'exploitation
- Backtrack linux - Télécharger - Sécurité
- R-linux - Télécharger - Sauvegarde
- Linux mint 22.1 - Accueil - Linux
8 réponses
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 ^^
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 !
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.
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
à 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à.
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
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
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!