IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème de link


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 154
    Par défaut Problème de link
    Salut tout le monde,

    J'aimerais pouvoir depuis des modules écrits en C pouvoir accéder à des modules écrit en C++.

    Pour cela, j'ai écrit une série de fonctions pour instancier/détruire une classe et pour accéder à chaques fonctions membres de l'objet.
    Cette série de fonctions seront appelés par des fonctions C.

    Voici les extraits des fichiers

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    // fichier MyExcelForC.h
    //------------------------------
    typedef void* POMYEXEL;
     
    BOOL g_bMyExcel_Run(POMYEXEL pvMyExcel);
     
    // fichier MyExcelForC.cpp
    //---------------------------------
    BOOL g_bMyExcel_Run(POMYEXEL pvMyExcel)
    {
    	MyExcel* poMyExcel = reinterpret_cast<MyExcel*>(pvMyExcel);
     
    	bool bResult = poMyExcel->RunExcel();
     
    	TRACE_OUT();
    	return bResult ? TRUE : FALSE;
    }
     
    // fichier test.c
    //-----------------
    #include "MyExcelForC.h"
     
    void test(void)
    {
    	...
    	g_bMyExcel_Run(pvMyExcel);
    	...    
    }
    La compilation se fait bien.
    Mais lors de l'édition de lien, la fonction g_bMyExcel_Run n'est pas trouvée.

    Environnement de développement VC++ version 6

    sauf erreur avec gcc il existe extern "CPP", que faire dans le cas de VC++

    Merci d'avance

    Philippe

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Tu dois sûrement compiler ton module partagé avec un compilo/linker C++ qui emploi une décoration C++ et non pas C.

    Donc pour que certaines fonctions aient une décoration de fonction C, il faut les déclarer en sein de la directive suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ifdef __cplusplus
    extern "C" {
    #endif  /* __cplusplus */
     
    /* déclaration ses fonction */
     
    #ifdef  __cplusplus
    }
    #endif
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  3. #3
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 154
    Par défaut
    Salut vicenzo,

    merci de ta réponse, en effet ça doit être la solution à mon désire.

    Avant de lire ta réponse, j'ai trouvé une vrai explication sur extern "C" parmi les nombreuses fausses explications trouvées sur le web.

    Comme tu le dit si bien, le fait de rajouter extern "C" fait que le compilateur C++ qui lira cette fonction ne rajoutera pas de décoration C++ avant et après le nom cette fonction et en conséquence utilisera la décoration C des compilateurs C.

    Grâce à ça nom seulement C++ peut appeler du C, ce que je faisais depuis longtemps mais que C peut aussi appeler du C++, puisque le nom de la fonction est la même pour les deux.

    Contrairement à ce qu'on peut lire sur le web, si la fonction est définie dans un module C++ le corps de la fonction est bien du C++ et non du C.

    Dès que je retourne au boulot demain, je test.

    Salutations à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DLL/classe template] problème de link
    Par Bob.Killer dans le forum C++
    Réponses: 7
    Dernier message: 31/08/2005, 18h56
  2. Problème de link...
    Par Royd938 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 30/09/2004, 17h33
  3. C/asm : problème pour link
    Par SteelBox dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 06/04/2004, 23h03
  4. Problème de LINK Bizarre !!
    Par Jasmine dans le forum MFC
    Réponses: 24
    Dernier message: 19/03/2004, 15h58
  5. Problème de link avec Borland C++ 5.5
    Par gelam dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 24/11/2003, 16h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo