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 :

Lecture librairie dynamique


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut Lecture librairie dynamique
    Bonjour,

    j'ai un petit soucis avec un warning :

    ISO C++ forbids casting between pointer-to-function and pointer-to-object
    J'ai créer un système de plugin, ou je crée des classes depuis des librairies dynamiques.

    Le code (sans la gestion des exceptions) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    handle = dlopen(_path.c_str(), RTLD_LAZY);
    create_t* createPlg = (create_t*) dlsym(handle, "create"); // Le warning est ici.
    PlgAbstract* newPlg = createPlg();
    Et la définition de la méthode create :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef PlgAbstract* create_t();
    Et chacun de mes plugins hérite de PlgAbstract.

    Je comprend que je crée une fonction à partir d'un symbole qui représente une classe. Mais comment faire le cast entre les deux reste pour moi un mystère.

    p.s. Le code est fonctionnel, mais j'ai lu qu'il peut y avoir une différence de taille entre l'objet et la fonction que je crée.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Il me semble que la bonne syntaxe est celle-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef PlgAbstract* (*create_t)();
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut
    Bon premièrement j'avais oublié un passage dans mon poste précédent :

    Mes plugins implémente la méthode suivante pour créer une instance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    extern "C" PlgMain* create()
    {
    	return new PlgMain;
    }
    Voici deux essais d'implémentation avec l'implémentation d'un pointeur de fonction :

    PlgAbstract :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef PlgAbstract* (*create_t)();
    Et la création des plugins :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    handle = dlopen(_path.c_str(), RTLD_LAZY);
    create_t* createPlg = (create_t*) dlsym(handle, "create");
    PlgAbstract* newPlg = (*createPlg)(); // Segfault ici !
    Ce première essai n'a plus de warning, mais il segfault.

    Deuxième tentative :

    PlgAbstract :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef PlgAbstract* (*create_t)();
    Et la création des plugins :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    handle = dlopen(_path.c_str(), RTLD_LAZY);
    create_t createPlg = (create_t) dlsym(handle, "create"); // Ancien warning ici.
    PlgAbstract* newPlg = (createPlg)();
    Et avec cette implémentation j'ai à nouveau un warning.

    Je suis un peu perdu la...

    Je me base sur cette source :
    http://www.isotton.com/devel/docs/C+...ini-HOWTO.html

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    J'ai l'impression que c'est un problème dans la spécification elle-même: dlsym() retourne un void* alors qu'elle devrait retourner un void(*)() pour les fonctions (mais elle a besoin de pouvoir retourner un void*, vu qu'on peut aussi récupérer des variables globales du .so).

    Résultat, je vois deux solutions possibles:
    1. Ignorer/désactiver le warning.
    2. Créer un wrapper dans lequel le warning sera désactivé.

    Pour le wrapper:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /*dlfunc.h*/
    typedef void (*anyfunc_t)();
     
    anyfunc_t dlfunc(void *handle, const char *name);
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /*dlfunc.c, à compiler avec le warning désactivé*/
    #include "dlfunc.h"
    #include <dlfcn.h>
    anyfunc_t dlfunc(void *handle, const char *name)
    {
    	return (anyfunc_t)dlsym(handle, name);
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut
    Merci de ton aide, je vais désactiver le warning, c'est pas très propre, mais je vois pas comment faire autrement non plus.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Au passage, ils sont au courant du problème:
    Citation Envoyé par [url=http://pubs.opengroup.org/onlinepubs/009695399/functions/dlsym.html]La doc[/url]
    Due to the problem noted here, a future version may either add a new function to return function pointers, or the current interface may be deprecated in favor of two new functions: one that returns data pointers and the other that returns function pointers.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Librairie dynamique OCR
    Par spaceclic dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 22/02/2007, 18h30
  2. [Kylix] Librairies dynamiques et Kylix C++
    Par Mitchou dans le forum EDI
    Réponses: 2
    Dernier message: 03/12/2004, 12h46
  3. Compiler et créer une librairie dynamique en C
    Par fidififouille dans le forum Linux
    Réponses: 3
    Dernier message: 30/11/2004, 16h36
  4. création d'une librairie dynamique
    Par bilo2000 dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 26/08/2004, 15h17
  5. Librairies dynamique sous AIX en C++ : MaLib.so
    Par didierM dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 23/10/2003, 18h19

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