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

Qt Discussion :

QLibrary : chargement d'un .so


Sujet :

Qt

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 80
    Points : 63
    Points
    63
    Par défaut QLibrary : chargement d'un .so
    bonjour,
    je cherche un moyen pour utiliser un librairie, coder par moi même en c++, après quelque recherche j'ai trouver QLibrary pouvais ouvrir un .so et utiliser les fonctions a l’intérieur seulement je n'arrive pas a charger les fonction présent dans mon .so
    voici le code que j’exécute*
    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
     
    void EvaluationWindows::test(){
        QLibrary myLib("libWESTGARD-SSM") ;
        typedef EUpdateResult (*MyPrototype)(bool); // EUpdateResult est le type de retour de ma fonction c'est une enum 
        MyPrototype resultUpdate =(MyPrototype) myLib.resolve("updateEvaluateParameterizableRulesIf1_2sSucceed");
        if(resultUpdate){
            EUpdateResult Eur = resultUpdate(false);
            if(Eur == UPDATE_OK){
                QMessageBox msgBox;
                msgBox.setText("Eur update ok");
                msgBox.exec();
            }
        }else{
            QMessageBox msgBox;
            msgBox.setText("fonction failed");
            msgBox.exec();
        }
    }
    malgré toute mes recherche je n'arrive pas a affiche autre chose que fonction failed a l'écran pouvez -vous m'aider svp

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Est-ce que dans votre bibliothèque, vous avez utiliser extern C autour des définitions ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 80
    Points : 63
    Points
    63
    Par défaut
    non je n'ai pas mis cela dans la définition mais je ne pense pas que le problème viennent de la car je n'arrive tous simplement pas a charger la librairie j'ai fais évoluée quelle que peux mon code pour pouvoir le constater,

    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
    void UpdateWindows::update(){
        QLibrary myLib("/home/charles/Desktop/IHMWestgard/Westgard-SSM/lib/libWESTGARD-SSM") ;
        typedef EUpdateResult (*MyPrototype)(bool);
        if(myLib.load()){
            MyPrototype resultUpdate =(MyPrototype) myLib.resolve("updateEvaluateParameterizableRulesIf1_2sSucceed");
            if(resultUpdate){
                EUpdateResult Eur = resultUpdate(false);
                if(Eur == UPDATE_OK){
                    QMessageBox msgBox;
                    msgBox.setText("Eur update ok");
                    msgBox.exec();
                }
            }else{
                QMessageBox msgBox;
                msgBox.setText("fonction failed");
                msgBox.exec();
            }
        }else{
            QMessageBox msgBox;
            msgBox.setText("load doesn't work ");
            msgBox.exec();
        }
    }
    voici ma nouvelle fonction qui ne me retourne rien d'autre que "load doesn't work" peut import le chemin que je lui donne
    j'ai egalement ajoute ma library au .pro mais ca me fais planter l'appli

    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
    QT += widgets
     
     
    SOURCES += \
        main.cpp \
        mainwindows.cpp \
        evaluationwindows.cpp \
        updatewindows.cpp \
        configwindows.cpp
     
    HEADERS += \
        mainwindows.h \
        evaluationwindows.h \
        EUpdateResult.h \
        updatewindows.h \
        configwindows.h
     
    win32:CONFIG(release, debug|release): LIBS += -L$$PWD/Westgard-SSM/lib/release/ -lWESTGARD-SSM
    else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/Westgard-SSM/lib/debug/ -lWESTGARD-SSM
    else:unix: LIBS += -L$$PWD/Westgard-SSM/lib/ -lWESTGARD-SSM
     
    INCLUDEPATH += $$PWD/Westgard-SSM/lib
    DEPENDPATH += $$PWD/Westgard-SSM/lib
    arrête moi si je me trompe mais extern C c'est pour utiliser une lib C en C++ ? or pour ma part tout est en C++


    j'ai tout de même essayer d'inclure extern C dans ma librairie mais ca me retourne un tas d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     error: template with C linkage
       template<bool PMemFunc, bool PMemData>
       ^~~~~~~~

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Le extern C permettra d'éviter le mangling des noms des fonctions. En effet, en C++, le symbole identifiant votre fonction updateEvaluateParameterizableRulesIf1_2sSucceed changera et ne sera pas updateEvaluateParameterizableRulesIf1_2sSucceed. C'est pour cette raison que le resolve() ne trouve pas le symbole, car le compilateur C++ a changé le symbole (et c'est normal de dire que le symbole doit embarquer des informations sur les paramètres de la fonction, c'est la norme).

    Pour l'erreur de changement, ce n'était pas ce que vous décriviez au premier message. Pour l'erreur de chargement, c'est qu'il ne trouve pas le fichier. D'ailleurs, vous ne donnez pas l'extension du fichier ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 80
    Points : 63
    Points
    63
    Par défaut
    effectivement je ne donne pas le nom de l’extension dans mon exemple, j'ai tout de même tester tout un tas de chemin différent avec et sans extension car j'ai trouver cette info sur la FAQ QT
    https://qt.developpez.com/faq/?page=plugins

    Après avoir créé un objet de ce type, il faut spécifier le nom de la bibliothèque dynamique à associer sans préciser l'extension, car celle-ci dépend de la plateforme.
    pour le externe c je ne pense pas l'avoir utiliser correctement faut'il juste le mettre dans le .h devant la définition de mes fonctions ?

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Arf. Désolé pour l'extension.
    Pour le extern, je le mets dans le .h et le .cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include ...
     
    extern C {
    func1();
    func2();
    }
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 80
    Points : 63
    Points
    63
    Par défaut
    merci de ta réponse mais apparemment je ne peux pas utiliser mon .so sur ma vm donc je dois repasser a un .dll pour utiliser sous windows

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Oui, les .so ne sont pas lisibles sous Windows (et les DLL, pas lisible sous Linux).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

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

Discussions similaires

  1. action APRES chargement complet ...
    Par PinGuy dans le forum Delphi
    Réponses: 7
    Dernier message: 06/07/2006, 17h16
  2. [Débutant][JNI]Erreur de chargement de dll
    Par Agifem dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 24/04/2003, 14h36
  3. [Kylix] Chargement de libraries
    Par _dack_ dans le forum EDI
    Réponses: 1
    Dernier message: 14/03/2003, 09h07
  4. Chargement d'une texture a partir de la mémoire
    Par logramme dans le forum DirectX
    Réponses: 6
    Dernier message: 27/01/2003, 14h57
  5. Chargement dynamique de DLL sous Unix
    Par Willou dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 18/12/2002, 18h25

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