[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   -
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!
A voir également:

8 réponses

Stupeflip Messages postés 391 Date d'inscription   Statut Membre Dernière intervention   94
 
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 ^^
0
GafouZ Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
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 !
0
Stupeflip Messages postés 391 Date d'inscription   Statut Membre Dernière intervention   94
 
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 ^^
#ifndef CONSTANTE_TEST
#include ton_fichier.h
#endif
Si 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.
0
GafouZ Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
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 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
à 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à.
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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
0
GafouZ Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
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!
0