 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
k0mp Guest
|
Posted: Sun Apr 16, 2006 4:08 pm Post subject: Problème d'édition de liens avec g++ |
|
|
Salut,
après avoir passé 5-6 heures à essayer de corriger le problème je
m'en remets à vous.
J'ai un problème pour compiler mon programme (sous linux).
Il est composé d'une bibliothèque de fonctions eth_lib.cc (+ les
headers eth_lib.h et inet_str.h) et d'un fichier principal test.cc.
test.cc possède les include suivants :
#include <string>
#include <iostream>
#include <vector>
#include "eth_lib.h"
eth_lib.cc possède les include suivants :
#include "eth_lib.h"
J'ai mis un
#ifndef __eth_lib_h__
#define __eth_lib_h__
....
#endif
dans eth_lib.h mais ça ne règle pas le problème.
En effet, quand je fais un :
g++ test.cc eth_lib.cc -o test
j'obtiens :
Dans le fichier inclus à partir de eth_lib.h:14,
à partir de test.cc:4:
/usr/include/linux/socket.h:7:2: attention : #warning "You should
include <sys/socket.h>. This time I will do it for you."
Dans le fichier inclus à partir de eth_lib.h:14,
à partir de eth_lib.cc:10:
/usr/include/linux/socket.h:7:2: attention : #warning "You should
include <sys/socket.h>. This time I will do it for you."
/tmp/ccN8GvTc.o .bss+0x0): définitions multiples de « ifr_orig »
/tmp/ccrJHgIP.o .bss+0x0): défini pour la première fois ici
/tmp/ccN8GvTc.o .bss+0x20): définitions multiples de « snoop_device
»
/tmp/ccrJHgIP.o .bss+0x20): défini pour la première fois ici
/tmp/ccN8GvTc.o .bss+0x40): définitions multiples de « program_name
»
/tmp/ccrJHgIP.o .bss+0x40): défini pour la première fois ici
/tmp/ccN8GvTc.o: dans la fonction « p_error(char*)»:
eth_lib.cc:(.text+0x38): AVERTISSEMENT: `sys_errlist' is deprecated;
use `strerror' or `strerror_r' instead
collect2: ld a retourné 1 code d'état d'exécution
Les fichiers de mon programme sont dispo sur netorld.free.fr/tp2.zip
Merci d'avoir pris la peine de lire mon message,
Alain |
|
| Back to top |
|
 |
Aurélien Barbier-Accary Guest
|
Posted: Sun Apr 16, 2006 6:06 pm Post subject: Re: Problème d'édition de liens ave c g++ |
|
|
k0mp a écrit :
| Quote: | J'ai un problème pour compiler mon programme (sous linux).
Il est composé d'une bibliothèque de fonctions eth_lib.cc (+ les
headers eth_lib.h et inet_str.h) et d'un fichier principal test.cc.
Les fichiers de mon programme sont dispo sur netorld.free.fr/tp2.zip
Merci d'avoir pris la peine de lire mon message,
Alain
|
Bonjour,
eth_lib.h inclut inet_str.h.
eth_lib.cc inclut eth_lib.h donc eth_lib.o comprend le contenu de inet_str.h
test.cc inclut eth_lib.h donc test.o comprend ce même contenu, d'où l'erreur.
Prends l'habitude d'utiliser le mécanismes des
#ifndef _NOM_FICHIER_H_
#define _NOM_FICHIER_H_
...
#endif
pour tous tes fichiers .h, les doubles inclusions sont courantes.
Sinon pour les warnings de type deprecated, c'est parce que désormais en C++ on
n'utilise plus des fichiers d'en-tête en *.h pour la librairie standard mais les
mêmes sans extension. Si ces fichiers sont issus du langage C, il faut également
ajouter un c devant le nom que tu connais.
Pour ton code, ça nous donne :
#include <cstdio> // remplace stdio.h
#include <string> // remplace string.h
#include <cstdlib> // remplace stdlib.h
#include <cerrno> // remplace errno.h
Pour plus d'infos, voir :
http://jlecomte.ifrance.com/c++/c++-faq-lite/coding-standards-fr.html
Aurélien Barbier-Accary
--
web: http://liris.cnrs.fr/aurelien.barbier |
|
| Back to top |
|
 |
k0mp Guest
|
Posted: Sun Apr 16, 2006 7:06 pm Post subject: Re: Problème d'édition de liens avec g++ |
|
|
Merci pour les infos j'ai réussi à me débarasser des deprecated par
contre j'avais utilisé le #ifndef.
Apparemment le problème vient de 3 variables (ifr_orig, program_name,
sys_errlist) déclarées en global.
Si je les définis en extern dans eth_lib.h et les redéclare dans
eth_lib.cc ça marche. Bien que je ne sois pas sur de bien comprendre
pourquoi. |
|
| Back to top |
|
 |
Aurélien Barbier-Accary Guest
|
Posted: Mon Apr 17, 2006 9:06 am Post subject: Re: Problème d'édition de liens ave c g++ |
|
|
k0mp a écrit :
| Quote: | Merci pour les infos j'ai réussi à me débarasser des deprecated par
contre j'avais utilisé le #ifndef.
Apparemment le problème vient de 3 variables (ifr_orig, program_name,
sys_errlist) déclarées en global.
Si je les définis en extern dans eth_lib.h et les redéclare dans
eth_lib.cc ça marche. Bien que je ne sois pas sur de bien comprendre
pourquoi.
|
Dans la version téléchargeable que tu as indiqué, tu n'as utilisé #ifndef... que
pour eth_lib.h, mais pas pour inet_str.h
Pour les variables que tu cites, il manque le mot clef extern devant leur
déclaration. Une variable portant ce nom est donc déclarée dans chaque fichier
..c incluant ce fichier .h, d'où l'existence double.
Il faut déclarer qu'une telle variable existe dans le .h en mettant extern
devant pour que chaque fichier .c puisse l'utiliser et dans seulement l'un deux
tu la crées réellement (en remettant la même chose mais sans le extern) en
l'initialisant en même temps éventuellement.
Ainsi, lors de l'édition de liens le compilateur recolles les morceaux sans
qu'il n'y ait de déclarations multiples.
Si je ne suis pas assez clair dis le moi et je corrigerai directement ton code.
--
Aurélien Barbier-Accary
http://liris.cnrs.fr/aurelien.barbier |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Mon Apr 17, 2006 11:06 am Post subject: Re: Problème d'édition de liens ave c g++ |
|
|
Aurélien Barbier-Accary wrote:
| Quote: | k0mp a écrit :
composé d'une bibliothèque de fonctions eth_lib.cc (+ les headers
eth_lib.h et inet_str.h) et d'un fichier principal test.cc.
Les fichiers de mon programme sont dispo sur netorld.free.fr/tp2.zip
Merci d'avoir pris la peine de lire mon message,
eth_lib.h inclut inet_str.h.
eth_lib.cc inclut eth_lib.h donc eth_lib.o comprend le contenu de
inet_str.h
test.cc inclut eth_lib.h donc test.o comprend ce même contenu, d'où
l'erreur.
Prends l'habitude d'utiliser le mécanismes des
#ifndef _NOM_FICHIER_H_
#define _NOM_FICHIER_H_
...
#endif
pour tous tes fichiers .h, les doubles inclusions sont courantes.
|
Il l'a fait, d'après ce qu'il a écrit. (Ben, il s'est servi des
noms réservés à l'implémentation pour le faire, ce qui donne un
comportement indéfini. Mais ce n'est pas la source de son
problème.)
| Quote: | Sinon pour les warnings de type deprecated, c'est parce que
désormais en C++ on n'utilise plus des fichiers d'en-tête en
*.h pour la librairie standard mais les mêmes sans extension.
Si ces fichiers sont issus du langage C, il faut également
ajouter un c devant le nom que tu connais.
|
Non plus. Au moins pas dans son cas. Il n'y a aucun problème
avec les includes de C ; seulement avec les anciennes versions
des en-têtes C++ (genre <strstream.h>).
En fait, les avertissements qu'il a sont liés à son installation
Linux. Et les multiples définitions, a priori, c'est qu'il a des
définitions (et non seulement des déclarations) dans les
en-têtes qu'il inclut.
| Quote: | Pour ton code, ça nous donne :
#include <cstdio> // remplace stdio.h
#include <string> // remplace string.h
#include <cstdlib> // remplace stdlib.h
#include <cerrno> // remplace errno.h
|
Ça se discute. Dans la mesure où il n'y a à ce jour aucun
compilateur qui implémente les formes <cxxx> correctement, je
préfère rester avec les anciennes. Au moins, je sais ce que
j'ai.
--
James Kanze kanze.james (AT) neuf (DOT) fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|