rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Résolu

[C++] Linux: Problème de linkage [niveau BTS]

GafouZ, le jeudi 22 mars 2007 à 10:11:44
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!
Configuration: Linux Mandriva
Firefox 1.5.0.7
Répondre à GafouZ  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Stupeflip, le jeudi 22 mars 2007 à 10:27:23
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 ^^
Répondre à Stupeflip

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
GafouZ, le jeudi 22 mars 2007 à 10:35:28
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 !
Répondre à GafouZ

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Stupeflip, le jeudi 22 mars 2007 à 10:41:27
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.
Répondre à Stupeflip

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
GafouZ, le jeudi 22 mars 2007 à 10:50:48
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 !
Répondre à GafouZ

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Char Snipeur, le jeudi 22 mars 2007 à 14:52:43
à 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à. Salutation !
Char Snipeur
Répondre à Char Snipeur

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Char Snipeur, le jeudi 22 mars 2007 à 14:59:01
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 Salutation !
Char Snipeur
Répondre à Char Snipeur

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
mamiemando, le jeudi 22 mars 2007 à 16:04:39
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
Répondre à mamiemando

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 GafouZ, le jeudi 22 mars 2007 à 19:49:30
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!
Répondre à GafouZ
Logiciels pertinents trouvés dans les téléchargements
Télécharger CHAOS Shredder 3.1CHAOS Shredder - CHAOS Shredder permet de supprimer de façon permanente des fichiers ou dossiers spécifiques, le contenu de la corbeille, les...Catégorie: Anonymat/Confidentialité
Licence: Freeware/gratuit
Télécharger K-Lite Codec Pack Full 4.1.7K-Lite Codec Pack Full - K-Lite Codec Pack est une collection de codecs et de filtres nécessaires pour encoder ou décoder des formats audio ou vidéo....Catégorie: Codecs
Licence: Open Source
Télécharger K-Lite Codec Pack Standard 4.1.7K-Lite Codec Pack Standard - K-Lite Codec Pack est une collection de codecs et de filtres nécessaires pour encoder ou décoder des formats audio ou vidéo....Catégorie: Codecs
Licence: Open Source
Télécharger Crystal Clear 1.0Crystal Clear - Crystal Clear est changera entièrement l'apparence de votre Windows XP en modifiant les fichiers système. Le pack...Catégorie: Personnalisation
Licence: Freeware/gratuit
Plus de logiciels gratuits sur « [C++] Linux: Problème de linkage [niveau BTS] »