Salut,
apr=E8s avoir pass=E9 5-6 heures =E0 essayer de corriger le probl=E8me je
m'en remets =E0 vous.
J'ai un probl=E8me pour compiler mon programme (sous linux).
Il est compos=E9 d'une biblioth=E8que de fonctions eth_lib.cc (+ les
headers eth_lib.h et inet_str.h) et d'un fichier principal test.cc.
test.cc poss=E8de les include suivants :
#include <string>
#include <iostream>
#include <vector>
#include "eth_lib.h"
eth_lib.cc poss=E8de les include suivants :
#include "eth_lib.h"
dans eth_lib.h mais =E7a ne r=E8gle pas le probl=E8me.
En effet, quand je fais un :
g++ test.cc eth_lib.cc -o test
j'obtiens :
Dans le fichier inclus =E0 partir de eth_lib.h:14,
=E0 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 =E0 partir de eth_lib.h:14,
=E0 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=E9finitions multiples de =AB ifr_orig =BB
/tmp/ccrJHgIP.o:(.bss+0x0): d=E9fini pour la premi=E8re fois ici
/tmp/ccN8GvTc.o:(.bss+0x20): d=E9finitions multiples de =AB snoop_device
=BB
/tmp/ccrJHgIP.o:(.bss+0x20): d=E9fini pour la premi=E8re fois ici
/tmp/ccN8GvTc.o:(.bss+0x40): d=E9finitions multiples de =AB program_name
=BB
/tmp/ccrJHgIP.o:(.bss+0x40): d=E9fini pour la premi=E8re fois ici
/tmp/ccN8GvTc.o: dans la fonction =AB p_error(char*)=BB:
eth_lib.cc:(.text+0x38): AVERTISSEMENT: `sys_errlist' is deprecated;
use `strerror' or `strerror_r' instead
collect2: ld a retourn=E9 1 code d'=E9tat d'ex=E9cution
Les fichiers de mon programme sont dispo sur netorld.free.fr/tp2.zip
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Aurélien Barbier-Accary
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
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
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
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.
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.
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.
Aurélien Barbier-Accary
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.
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.
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.
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.)
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.
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 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
Aurélien Barbier-Accary wrote:
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.)
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.
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@neuf.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
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.)
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.
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 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