[Kos-dev] [David Decotigny <David.Decotigny@irisa.fr>] Re: Idee ?
Thomas Petazzoni
kos-dev@enix.org
18 Nov 2002 09:39:55 +0100
--=-=-=
Bonjour,
Je forwarde ici meme une reponse de David a un mail prive concernant
l'utilisation de C++ dans KOS (details techniques concernant le
linkage).
Thomas
--=-=-=
Content-Type: message/rfc822
Content-Disposition: inline
X-From-Line: David.Decotigny@irisa.fr Mon Nov 18 09:37:15 2002
Return-Path: <David.Decotigny@irisa.fr>
Delivered-To: thomas@localhost.kos.nx
Received: from localhost (localhost [127.0.0.1])
by crazy (Postfix) with ESMTP id 4C5FD1A876
for <thomas@localhost>; Mon, 18 Nov 2002 09:37:15 +0100 (CET)
Delivered-To: thomas@the-doors.enix.org
Received: from the-doors.enix.org [62.4.21.166]
by localhost with IMAP (fetchmail-6.1.0)
for thomas@localhost (single-drop); Mon, 18 Nov 2002 09:37:15 +0100 (CET)
Received: from sky.irisa.fr (sky.irisa.fr [131.254.60.147])
by the-doors.enix.org (Postfix) with ESMTP id F13B010034
for <thomas.petazzoni@enix.org>; Mon, 18 Nov 2002 09:31:49 +0100 (CET)
Received: from blutch.irisa.fr (blutch.irisa.fr [131.254.13.41])
by sky.irisa.fr (8.11.4/8.11.4) with ESMTP id gAI8Xq719457;
Mon, 18 Nov 2002 09:33:52 +0100 (MET)
To: Thomas Petazzoni <thomas.petazzoni@enix.org>,
Julien Munier <munier@wanadoo.fr>
Cc: david.decotigny@irisa.fr
Subject: Re: Idee ?
References: <87el9jic1g.fsf@crazy.kos.nx>
X-Attribution: d2
X-Mailer: My GNUS is rich
Reply-To: David.Decotigny@irisa.fr
X-Loop: David.Decotigny@irisa.fr
In-Reply-To: <87el9jic1g.fsf@crazy.kos.nx>
From: David Decotigny <David.Decotigny@irisa.fr>
Sender: David.Decotigny@irisa.fr
Original-Sender: David.Decotigny@irisa.fr
X-Subliminal: My GNUS is rich
X-Home-Page: http://david.decotigny.proxone.net
X-Portrait: http://www.irisa.fr/PHOTOS/html/ddecotig.html
X-VCard: http://david.decotigny.proxone.net/d2.vcf
Date: 18 Nov 2002 09:33:52 +0100
Message-ID: <wacptt3e0pb.fsf@blutch.irisa.fr>
User-Agent: Gnus/5.0808 (Gnus v5.8.8) Emacs/20.7
X-MailScanner: Found to be clean
Lines: 64
Xref: crazy.kos.nx david:494
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Bonjour,
>>>>> "Thomas" == Thomas Petazzoni <thomas.petazzoni@enix.org> writes:
Thomas> un fichier c++ a compiler. Mais on a dors et deja essaye
Thomas> de linker, mais ca marche pas, il nous sort :
Thomas> ********************************************
Thomas> [relocate_section@link.c:72] **** System Halted **** :
Thomas> Unresolved symbol "snprintf__FPcUiPCce" in module kares.ro
C'est normal : c'est le coup du "name mangling" C++. En C++, la
fonction "void foo(int)" ne s'appelle pas "foo" dans le binaire, mais
"foo__Fi" (suivant version de gcc, en plus : pour le "decrypter",
utiliser le programme c++filt compile avec gcc [faire bien attention a
la version du compilo]). Bref, quand on dit a g++ qu'on souhaite
utiliser la fonction snprintf(), le nom C++ est theoriquement
"snprintf__FPciPCce", et c'est ce nom que C++ dit de chercher lors de
l'edition de liens. Pour bien lui dire que snprintf() n'est pas un
symbole a interpreter en tant que C++, il faut lui preciser que ce
n'est pas une declaration de fonction C++, mais une declaration C
(dans l'exemple) => extern "C".
La technique, c'est de changer les headers C, en les transformant :
----------------------------------
#ifndef __THE_C_HEADER___
#define __THE_C_HEADER___
#include <autres_includes.h>
#include "autres_includes_loc.h"
(en general, ici on met les typedef, macros, les struct et compagnie,
mais on peut aussi les mettre ci-dessous)
#ifdef __cplusplus
extern "C" {
#endif
Le
contenu
du
header
C
normal
(Ici on met les proto de fonction C ET les variables globales
[OBLIGATOIRE], mais on peut aussi mettre les typedef, macros,
struct....)
#ifdef __cplusplus
}
#endif
#endif /* __THE_C_HEADER___ */
----------------------------------
Pour des exemples, voir les /usr/include/*.h
Bonne journee,
--
David Decotigny
--=-=-=
--
PETAZZONI Thomas - thomas.petazzoni@enix.org - UIN : 34937744
(Perso) http://www.enix.org/~thomas/
(KOS) http://kos.enix.org/
(Club LinUT) http://club-linut.enix.org
--=-=-=--