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

Langage C++ Discussion :

Des références, classes et namespace dans un extern C


Sujet :

Langage C++

  1. #1
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut Des références, classes et namespace dans un extern C
    Bonjour,

    J'ai actuellement le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    extern"C" {
        __declspec(dllexport) void run(NLP::VirtualKernel & ptr);
    }
    Étonnamment, sous Windows, le symbole run est bien trouvé et je peux l'utiliser sans problème dans du code C++.
    Cela m'arrange assez car j'évite ainsi de passer des void * ainsi que différents cast monstreux.

    Malheureusement, je ne peux pas tester sous Linux si cela marche aussi et je ne pense pas que le comportement soit "standard".
    Bien sûr, il peut y avoir des incompatibilité entre compilateurs et versions de compilateurs (entre celui qui compile la dll et celui qui compile l'exécutable).

    Sous Windows j'utilise mingw et sous Linux, j'utiliserai gcc, pensez-vous que ce code fonctionnera tout aussi bien sous Linux ?
    Ou est-ce que vous pensez que je doive absolument éviter cela ?

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    merci à Ehonn pour son test sous Linux :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    //-------------- lib.c
     
    namespace NLP {
        class VirtualKernel
        {
          public :
                   virtual void foo(void) = 0;
            ~VirtualKernel(void){}
     
        };
    }
     
    extern "C" {
        __attribute__((visibility("default"))) void run(NLP::VirtualKernel & ptr)
        {
             ptr.foo();
        }
    }
    //---------------- main.c
     
    #include <iostream>
    #include <dlfcn.h>
     
    namespace NLP {
        class VirtualKernel
        {
          public :
                   virtual void foo(void) = 0;
            ~VirtualKernel(void){}
     
        };
     
        class Kernel : public VirtualKernel
        {
        public :
            void foo(void){ std::cerr << "ok" << std::endl; }
     
        };
    }
     
    typedef void (*Fct)(NLP::VirtualKernel & ptr);
     
    int main(void)
    {
        NLP::Kernel k;
     
        void * handle = dlopen("liblib.so", RTLD_NOW | RTLD_GLOBAL);
        if( ! handle )
        {
            std::cerr << dlerror() << std::endl;
            return 1;
        }
     
        void * symb = dlsym(handle, "run");
        if( ! handle )
        {
            std::cerr << dlerror() << std::endl;
            return 1;
        }
     
        Fct run = (Ftc) symb;    
        run(k);
     
        return 0;
    }
    Affiche "ok".

  3. #3
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    De rien

    J'ai corrigé deux-trois trucs dont la ligne 45 (ce qui fait environ la ligne 25 de main.c).
    Voici les commandes utilisées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -shared -Wall -Wextra -Wconversion -Wsign-conversion -std=c++11 -pedantic -fopenmp lib.c -o liblib.so
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -Wall -Wextra -Wconversion -Wsign-conversion -std=c++11 -pedantic -fopenmp -ldl main.c

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/04/2008, 11h24
  2. Réponses: 4
    Dernier message: 16/03/2008, 18h06
  3. Recuperer des références dans mes mails
    Par pascal_macro dans le forum VBA Outlook
    Réponses: 11
    Dernier message: 29/01/2008, 14h33
  4. erreur dans la tâche Mappage des références de ressource
    Par kramer Mc Barreth dans le forum Websphere
    Réponses: 4
    Dernier message: 27/12/2007, 14h01
  5. Réponses: 2
    Dernier message: 20/02/2007, 21h26

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