C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Problème d'édition de liens avec g++

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
k0mp
Guest





PostPosted: Sun Apr 16, 2006 4:08 pm    Post subject: Problème d'édition de liens avec g++ Reply with quote



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.oSad.bss+0x0): définitions multiples de « ifr_orig »
/tmp/ccrJHgIP.oSad.bss+0x0): défini pour la première fois ici
/tmp/ccN8GvTc.oSad.bss+0x20): définitions multiples de « snoop_device
»
/tmp/ccrJHgIP.oSad.bss+0x20): défini pour la première fois ici
/tmp/ccN8GvTc.oSad.bss+0x40): définitions multiples de « program_name
»
/tmp/ccrJHgIP.oSad.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





PostPosted: Sun Apr 16, 2006 6:06 pm    Post subject: Re: Problème d'édition de liens ave c g++ Reply with quote



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





PostPosted: Sun Apr 16, 2006 7:06 pm    Post subject: Re: Problème d'édition de liens avec g++ Reply with 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.
Back to top
Aurélien Barbier-Accary
Guest





PostPosted: Mon Apr 17, 2006 9:06 am    Post subject: Re: Problème d'édition de liens ave c g++ Reply with quote

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





PostPosted: Mon Apr 17, 2006 11:06 am    Post subject: Re: Problème d'édition de liens ave c g++ Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.