[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

--=-=-=--