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 :

Création d'un librairie dynamique avec Qt


Sujet :

Qt

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Points : 52
    Points
    52
    Par défaut Création d'un librairie dynamique avec Qt
    Bonjour à tous.
    N'ayant pas (réussi à installer) Qt sous code::blocks, est-ce que quelqu'un pourrais me dire comment fait-t-on pour créer une librairie dynamique (ou statique dans le pire des cas) avec le compilateur de Qt ?
    Merci d'avance de vos réponses.

  2. #2
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    Salut, il te faut le specifier dans ton .pro

    Tiens, jette un coup d'oeil sur le manuel de qmake :

    documentation de qmake

    Tu trouveras un peu plus bas comment construire une bibliotheque :

    documentation de qmake - building a library

  3. #3
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    Je viens de faire rapidement un projet Qt Library vide avec l'integration de Qt dans Visual.

    J'ai 2 headers :
    • empty_library.h
    • empty_library_global.h


    et un fichier source :
    • empty_library.cpp


    dans le header *global*, y 'a pas grand chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <Qt/qglobal.h>
     
    #ifdef EMPTY_LIBRARY_LIB
    # define EMPTY_LIBRARY_EXPORT Q_DECL_EXPORT
    #else
    # define EMPTY_LIBRARY_EXPORT Q_DECL_IMPORT
    #endif
    Dans l'autre header il y a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "empty_library_global.h"
     
    class EMPTY_LIBRARY_EXPORT Empty_library
    {
    public:
    	Empty_library();
    	~Empty_library();
    private:
    };
    et dans le cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "empty_library.h"
    Empty_library::Empty_library()
    {
     
    }
     
    Empty_library::~Empty_library()
    {
     
    }
    Note : j'ai coupe les trucs pour eviter les inclusions multiples pour alleger le topic.

    Voila le .pro :
    TEMPLATE = lib
    TARGET = Empty_library
    DESTDIR = ../Debug
    CONFIG += debug

    DEFINES += EMPTY_LIBRARY_LIB
    INCLUDEPATH += ./GeneratedFiles \
    ./GeneratedFiles/Debug \
    .
    DEPENDPATH += .
    MOC_DIR += ./GeneratedFiles/debug
    OBJECTS_DIR += debug
    UI_DIR += ./GeneratedFiles
    RCC_DIR += ./GeneratedFiles


    #Header files
    HEADERS += ./empty_library.h \
    ./empty_library_global.h

    #Source files
    SOURCES += ./empty_library.cpp
    Le truc le plus important c'est le Q_DECL_EXPORT, ça doit etre une macro pour indiquer au compilateur la visibilité des objets/variables...

    Voila, j'espere t'avoir repondu, au moins sur la forme.

  4. #4
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    Cette macro est liée à
    • __declspec(dllexport)
    • __attribute__((visibility("default")))
    • __declspec(dllimport)


    Un petit tour du cote de msdn Microsoft et on en sait un peu plus :

    L'édition 32 bits de Visual C++ utilise _declspec(dllimport) et _declspec(dllexport) pour remplacer le mot clé __export précédemment utilisé dans les versions 16 bits de Visual C++.

    Vous ne devez pas utiliser _declspec(dllimport) pour votre code à compiler correctement, mais cela permet par conséquent, le compilateur à générer un code de meilleure qualité. Le compilateur est en mesure de générer un code de meilleure qualité, car il sait par que si une fonction existe dans une DLL ou pas, donc le compilateur peut générer des codes qui ignorer un niveau d'indirection qui est normalement être présent dans un appel de fonction qui franchi une limite la DLL.

    Avec la section EXPORTS du fichier .def appropriée, _declspec(dllexport) n'est pas requis. _declspec(dllexport) a été ajoutée pour fournir un moyen facile d'exporter des fonctions à partir d'un .exe ou .dll sans à l'aide d'un fichier .def.

    Le reste de cet article fournit une description relativement bas niveau, approfondie de ces problèmes.

    Le format de l'exécutable portable Win32 est conçu pour réduire au minimum le nombre de pages de qui doit être touchées pour corriger les importations. Pour ce faire, il place toutes les adresses d'importation pour n'importe quel programme dans un seul endroit appelé la table d'adresses d'importation. Cela permet le chargeur modifier uniquement une ou deux pages lors de l'accès à ces importations.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Points : 52
    Points
    52
    Par défaut
    Merci beaucoup.
    Peut-on quand-même programmer une librairie et la compiler avec le compilateur de Qt comme on le ferai avec une librairie "normale" ?

  6. #6
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    Salut, je sais pas essaie et tu seras fixé. il te faudra quand même préciser dans le .pro que c'est une lib et aussi préciser ce que tu veux exporter. En somme, je pense que la méthode Qt n'est qu'une simplification (avec la macro) d'une autre, le résultat est le même.
    Attends que Mongaulois pointe le bout de son nez, il te dira.

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut
    Citation Envoyé par Crabe05 Voir le message
    Merci beaucoup.
    Peut-on quand-même programmer une librairie et la compiler avec le compilateur de Qt comme on le ferai avec une librairie "normale" ?
    qu'appelle tu le compilateur Qt????
    si tu parle de Qmake, ce n'est pas un compilateur c'est une créateur de makefile.
    Que tu utilise ou non Qt tu peut faire un lib.

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Points : 52
    Points
    52
    Par défaut
    Merci de vos réponse.
    Cependant je ne fait pas de librairie avec une classe, juste avec des fonctions, et elle bug. Voici les constructions des fichiers :

    Construction générale du .cpp (ce ne sont pas les fonctions):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #define DllExport   __declspec(dllexport)
     
    #include "fichier.h"
     
    QString DllExport addition (int nombre1, int nombre2)
    {
         int resultat = nombre1 + nombre2
         QString resultatstr = QString::number(resultat);
         return resultatstr;
    }

    Construction générale du .h (ce ne sont pas les fonctions):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifndef FICHIER_H
    #define FICHIER_H
     
    #define DllImport   __declspec(dllimport)
     
    QString DllImport addition(int nombre1, int nombre2);
     
    #endif
    Et l'erreur rencontrée est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fichier.h:4: error: expected constructor, destructor, or type conversion before "addition"
    fichier.h:4: error: expected ',' or ';' before "addition"
    Voilà. Pourriez-vous m'aider ?
    Merci d'avance.

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Le problème de base n'est pas vraiment un problème Qt...
    Comment veut tu utiliser cette lib après???
    tu link avec?
    tu la charge dynamiquement?

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Points : 52
    Points
    52
    Par défaut
    Je compte faire une librairie dynamique "classique", avec génération du .a et du .dll. Ensuite la linker dans le .pro du projet dans laquelle je vais l'utiliser et mettre les .dll avec les autres. (En générale, je n'utilise pas le chargement explicite, faute de portabilité).

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Crabe05 Voir le message
    Je compte faire une librairie dynamique "classique", avec génération du .a et du .dll. Ensuite la linker dans le .pro du projet dans laquelle je vais l'utiliser et mettre les .dll avec les autres. (En générale, je n'utilise pas le chargement explicite, faute de portabilité).
    ok. Tu devrais rechercher et demander dans le forum C++.
    Je préfère ne pas trop dire de connerie... en gros ce que j'ai compris :

    __declspec(dllexport) : précise ce qui doit être accessible dans la dll : code et class qui sera dans la dll. Utiliser quand on compile la dll.

    __declspec(dllimport) : précise ce qui dest accessible dans la dll : code et class qui est dans la dll. Utiliser quand on utilise directement la dll.

    En générale on utilise un macro qui vaut __declspec(dllexport) pour la compilation de la dll et __declspec(dllimport) pour son utilisation.

    Il me semble que __declspec(dllexport) sert aussi pour l'utilisation d'une dll par chargement dynamique.

    Une dll sert uniquement si tu veut partager du code commun à plusieurs exe ou pour être utilisé par chargement dynamique. Sinon utilise plutôt des lib statique.

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Points : 52
    Points
    52
    Par défaut
    Merci beaucoup de ton aide.
    Je vais donc continuer sur le forum C++.

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

Discussions similaires

  1. Création d'une librairie dynamique avec gcc
    Par ba10 dans le forum Autres éditeurs
    Réponses: 0
    Dernier message: 16/12/2009, 19h20
  2. Création d'un librairie dynamique
    Par Crabe05 dans le forum C++
    Réponses: 1
    Dernier message: 02/01/2009, 12h12
  3. [XSLT] Création de fichier XML dynamique avec PHP
    Par daninho dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 02/02/2006, 11h18
  4. Création d'un tableau dynamique avec XSL-FO
    Par lionelbrizuela dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 31/01/2006, 11h04
  5. création d'une librairie dynamique
    Par bilo2000 dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 26/08/2004, 15h17

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