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 :

problème d'exécution de dll


Sujet :

Qt

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Par défaut problème d'exécution de dll
    Bonjour,

    Je me lance aujourd'hui dans ma premiére dll sous Qt et j'ai un petit probléme lors de l'éxécution d'une des classe de ma librairie dans un programme.

    Alors j'explique tout ca, j'ai ma dll Qt qui s'appelle PROCESS_LIB. dans cette dll j'ai 3 fichier.
    le premier processlib_global.h :
    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
    #ifndef PROCESSLIB_GLOBAL_H
     #define PROCESSLIB_GLOBAL_H
     
     #include <QtCore/qglobal.h>
     #include <QVariant>
     #include <QStandardItemModel>
     #include <QStandardItem>
     
     #if defined(PROCESSLIB_LIBRARY)
     # define PROCESSLIBSHARED_EXPORT Q_DECL_EXPORT
     #else
     # define PROCESSLIBSHARED_EXPORT Q_DECL_IMPORT
     #endif
     
     #endif // PROCESSLIB_GLOBAL_H
    Le second Material.h :




    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
    #ifndef MATERIAL_H
     
     #define MATERIAL_H
     
     #include "ProcessLib_global.h"
     
     
     class PROCESSLIBSHARED_EXPORT Material
     {
     public:
         Material();
         Material(const Material& other);
         ~Material();
         inline const int& Id()  {return _Id;}
         inline const int& Goal()  {return _Goal;}
         inline const int& Reach()  {return _Reach;}
         inline const int& Humidity()  {return _Humidity;}
         QStandardItemModel  GetModel();
         static void InitMaterialSystem ();
     
     private:
         QStandardItemModel  _Model;
         int _Id;
         int _Goal;
         int _Reach;
         int _Humidity;    
     
         friend QDataStream & operator << (QDataStream &, const Material &);
         friend QDataStream & operator >> (QDataStream &, Material &);
     };
     
     
     Q_DECLARE_METATYPE(Material)
     QDataStream & operator << (QDataStream & out, const Material & Valeur);
     QDataStream & operator >> (QDataStream & in, Material & Valeur);
     
     #endif // MATERIAL_H
    et le 3, c'est <gras>Material.cpp</gras> qui est sans importance.


    Ensuite j'ai un programme test avec le main suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <QtGui/QApplication>
     #include <QtGui>
     
     #include <Material.h>
     
     
     int main(int argc, char  argv[])
     {
         QApplication a(argc, argv);
         Material mat;
         return a.exec();
     }
    et le .pro de Qt creator comme suivant:
    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
    # -------------------------------------------------
     # Project created by QtCreator 2010-06-18T15:58:42
     # -------------------------------------------------
     TARGET = Test
     TEMPLATE = app
     SOURCES += main.cpp \
         widget.cpp
     HEADERS += widget.h
     
     PROCESS_LIB_PATH = ../ProcessLib
     
     DEFINES += PROCESSLIB_LIBRARY
     
     INCLUDEPATH += $$PROCESS_LIB_PATH
     
     CONFIG(debug, debug|release):LIBS += -L$$PROCESS_LIB_PATH\debug\
         -lProcessLib
     else:LIBS += -L$$PROCESS_LIB_PATH\release \
         -lProcessLib
    CONSEQUENCES:

    Quand j'exécute en release j'ai l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \Test.exe s'est terminé avec le code -1073741515
    et quand je l'éxécute en debug avec un point d'arret Qt creator bug. est ce quelqu'un aurait-il une idée, merci.

  2. #2
    Membre Expert
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Par défaut
    Bonjour,

    Sous quel O.S. développes-tu? As-tu essayé de le débugguer avec un autre débuggeur (gdb par exemple) ?

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Par défaut
    Je tourne sous windows, et j'utilise Qt creator, qmake et compagnie. a mon avis cela viens de la façon dont j'inclue pas librairie, mais j'en suis pas sur

  4. #4
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 30
    Par défaut


    Je ne suis pas certain mais pour commencer je crois que vu que Matériel.h est un fichier header que tu as créé, tu dois mettre:

    plutôt que:
    les <> sont généralement pour les librairies Qt.

    De plus je pense qu'il faut bien faire un lien entre la déclaration de la classe et la définition de celle-ci, vérifie peut-être que toutes tes fonction sont bien définies.

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Par défaut
    Salut j'ai essayé avec ca, et ca ne fonctionne toujours pas.

    Je sais vraiment pas pourquoi ca me met cette erreur???

    Quand je passe en mode debug, j'ai l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Echec de l'éxécutable: you can't do that without a process to debug
    Je comprends de moin en moin la

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour tiagocerqueira

    Concernant ton problème, j'ai l'impression qu'il vient de tes .pro

    Pour rappel, une classe dans une lib doit être déclaré export (avec Q_DECL_EXPORT) dans la lib et en import (avec Q_DECL_IMPORT) dans le programme. Pour cela, on utilise en général (comme tu l'as fait), un fichier xxx_global.h permettant de définir si on compile la lib ou le programme : dans le .pro de la lib, tu ajoutes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DEFINES += PROCESSLIB_LIBRARY
    qui permet de définir la constante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #  define PROCESSLIBSHARED_EXPORT Q_DECL_EXPORT
    pour exporter ta classe.

    Dans le programme, tu ne définis pas PROCESSLIB_LIBRARY, ce qui permet de définir la constante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #  define PROCESSLIBSHARED_EXPORT Q_DECL_IMPORT
    pour importer ta classe.

    Ici, il semblerait que tu aies ajouter le DEFINES dans le .pro de ton programme, d'où l'erreur (probablement)

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Par défaut
    Merci pour la réponse, c'est cool. y'a pus qu'a marquer comme résolu

  8. #8
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 30
    Par défaut
    Par exemple, ça pourrait s'écrire comme ça ?
    librairie .dll:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #define MYLIB_EXPORT Q_DECL_EXPORT
    class MYLIB_EXPORT mylib
    {
    public:
    mylib();
    ~mylib();
    };
     
    mylib::mylib(){}
    mylib::~mylib(){}
    Programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #define MYLIB_EXPORT Q_DECL_IMPORT
     
    mylib test;
    je travaille avec VS 2008, je dois seulement rajouter dans les propriétés du projet le fichier .lib de la librairie?

    Merci d'avance

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

Discussions similaires

  1. Problème d'exécution DLL
    Par manu7607 dans le forum SharePoint
    Réponses: 1
    Dernier message: 10/12/2009, 21h23
  2. Problèmes de libération de Dll en delphi7 sous windows XP
    Par Tardiff Jean-François dans le forum Langage
    Réponses: 5
    Dernier message: 10/01/2006, 15h30
  3. Réponses: 5
    Dernier message: 19/04/2005, 08h50
  4. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20
  5. Problème à l'exécution avec wxWindows (compilé avec BCC55)
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 14/11/2003, 18h04

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