Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

4 réponses
Avatar
k0mp
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"

J'ai mis un

#ifndef __eth_lib_h__
#define __eth_lib_h__
.=2E.
#endif

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

Merci d'avoir pris la peine de lire mon message,

Alain

4 réponses

Avatar
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

Aurélien Barbier-Accary
--
web: http://liris.cnrs.fr/aurelien.barbier

Avatar
k0mp
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.
Avatar
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.

--
Aurélien Barbier-Accary
http://liris.cnrs.fr/aurelien.barbier

Avatar
James Kanze
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
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