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 :

Préprocesseur et DLL


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    dev
    Inscrit en
    Avril 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Avril 2010
    Messages : 53
    Par défaut Préprocesseur et DLL
    Hello,

    Je cherche à avoir quelques infos sur les commandes préprocesseurs Qt suivantes:
    - QT_LARGEFILE_SUPPORT
    - QT_THREAD_SUPPORT
    - QT_CORE_LIB
    - QT_GUI_LIB
    - QT_DLL
    Je n'ai rien trouvé dans la doc officielle et encore moins une liste exhaustive.

    Mon problème est le suivant:

    Je dérive un composant Qt dans une de mes DLL. Cela fait intervenir les commandes dllimport et dllexport.

    La DLL compile bien mais quand je compile autres projets dépendants, j'ai des erreurs de link (dllimport). Je fais attention d'utiliser les même commandes préprocesseurs au cours du moc'ing du fichier .h contenant mon objet Qt que dans les paramètres Visual Studio.

    Certaines sont liées à Qt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    error LNK2019: symbole externe non résolu "__declspec(dllimport) public: class QString __thiscall QMetaObject::tr(char const *,char const *)const " (__imp_?tr@QMetaObject@@QBE?AVQString@@PBD0@Z) référencé dans la fonction "public: static class QString __cdecl MyClass::tr(char const *,char const *)" (?tr@MyClass@@SA?AVQString@@PBD0@Z)
    error LNK2001: symbole externe non résolu "public: static struct QMetaObject const MyClass::staticMetaObject" (?staticMetaObject@MyClass@@2UQMetaObject@@B)
    error LNK2019: symbole externe non résolu "__declspec(dllimport) public: class QString __thiscall QMetaObject::trUtf8(char const *,char const *)const " (__imp_?trUtf8@QMetaObject@@QBE?AVQString@@PBD0@Z) référencé dans la fonction "public: static class QString __cdecl MyClass::trUtf8(char const *,char const *)" (?trUtf8@MyClass@@SA?AVQString@@PBD0@Z)
    error LNK2019: symbole externe non résolu "__declspec(dllimport) public: class QString __thiscall QMetaObject::tr(char const *,char const *,int)const " (__imp_?tr@QMetaObject@@QBE?AVQString@@PBD0H@Z) référencé dans la fonction "public: static class QString __cdecl MyClass::tr(char const *,char const *,int)" (?tr@MyClass@@SA?AVQString@@PBD0H@Z)
    error LNK2019: symbole externe non résolu "__declspec(dllimport) public: class QString __thiscall QMetaObject::trUtf8(char const *,char const *,int)const " (__imp_?trUtf8@QMetaObject@@QBE?AVQString@@PBD0H@Z) référencé dans la fonction "public: static class QString __cdecl MyClass::trUtf8(char const *,char const *,int)" (?trUtf8@MyClass@@SA?AVQString@@PBD0H@Z)
    et d'autre à mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    error LNK2001: symbole externe non résolu "private: static class std::vector<class MyClass *,class std::allocator<class MyClass *> > MyClass::_MyClassList" (?_ScriptableList@MyClass@@0V?$vector@PAVMyClass@@V?$allocator@PAVMyClass@@@std@@@std@@A)
    error LNK2001: symbole externe non résolu "private: static int const MyClass::_columnCount" (?_columnCount@MyClass@@0HB)
    Sachant que si je ne dérive pas de l'objet Qt, je n'ai pas l'erreur de link sur le membre static "_columnCount" de ma classe. Je suppose qu'il manque une option lors du moc'ing du fichier .h qui cause ce problème.

    Avez-vous des pistes ??

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Salut,

    Je ne sais pas si tu as lu ça, mais perso, en le suivant pas à pas, j'ai résolu (à l'époque) pas mal de mes problèmes lors de la création de DLL.

    http://qt.developpez.com/doc/latest/sharedlibrary.html

    G.

  3. #3
    Membre averti
    Profil pro
    dev
    Inscrit en
    Avril 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Avril 2010
    Messages : 53
    Par défaut
    J'y ai cru mais les macros Q_DECL_EXPORT et Q_DECL_IMPORT ne font que redéfinir d'une manière portable les symboles __declspec(dllexport) __declspec(dllexport) sous windows.
    Ce qui était déjà fait dans mon programme

  4. #4
    Membre averti
    Profil pro
    dev
    Inscrit en
    Avril 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Avril 2010
    Messages : 53
    Par défaut
    Dans ce thread, on se pose également la question
    http://www.qtcentre.org/archive/index.php/t-1232.html

    Je ne sais dans quelles mesures, on doit utiliser les commandes préprocesseurs QT_DLL et QT_SHARED(?) dans la dll compilée, la dll client et les options de moc.exe ??

    Il y a du nouveau, en faisant dérivée ma classe de QObject, je n'ai plus qu'une seul erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error LNK2001: symbole externe non résolu "public: static struct QMetaObject const MyClass::staticMetaObject" (?staticMetaObject@MyClass@@2UQMetaObject@@B)
    Ce qui me conforte dans l'idée que le problème semblerait se situer au niveau des paramètres de moc.exe, mais quoi ??

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    On pourrait voir ton .pro ? et peut être un .h (ou une partie) pour voir les déclarations de tes classes ?

    G.

  6. #6
    Membre averti
    Profil pro
    dev
    Inscrit en
    Avril 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Avril 2010
    Messages : 53
    Par défaut
    C'était en fait une erreur dans la manière dont était gérée les dll import /export dans mon projet. J'ai réutilisé la méthode décrite et ça a fonctionné

    Merci

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

Discussions similaires

  1. préprocesseur et dll
    Par noir_desir dans le forum LabVIEW
    Réponses: 0
    Dernier message: 04/03/2013, 16h19
  2. Declarer une dll Delphi ?
    Par DelphiCool dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/07/2002, 10h07
  3. Débug de DLL
    Par Bayard dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/07/2002, 15h08
  4. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 21h07
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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