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 de linker pour création de dll avec QtCreator


Sujet :

Qt

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 22
    Points
    22
    Par défaut problème de linker pour création de dll avec QtCreator
    Bonjour,

    Je suis actuellement en train de faire un petit projet pour me familiariser avec Qt, et je bloque sur la compilation depuis l'ajout d'une classe à mon projet.
    Pour commencer, je donne ma configuration: QtCreator sous WinXP.

    Je précise que j'ai pour ambition de faire une MainFrame en projet principal, et qui utilise des DLL (ou SO si je les fais sous Linux) pour obtenir des Widgets qui peuvent très bien vivre séparément.

    J'ai créé des classes de base qui n'implémentaient pas QWidget, sauf une classe principale vide, et depuis que j'ai développé un des Widgets à insérer, il me met un problème de linker systématique.

    Au niveau de l'architecture, c'est un peu du MVC:
    - la classe VirtualCard qui contient toutes mes données à manipuler.
    - la classe ShowContact qui doit afficher un formulaire contenant ces données. Elle hérite de QWidget.

    Quand j'ai créé la classe VirtualCard, et quelques classes annexes (pour définir des enum et faire l'interface avec le système de fichier), je n'ai eu aucun problème, et j'arrivais à faire ma DLL.
    Mais depuis que j'ai rajouté ma classe ShowContact, qui utilise à pleins poumons les accesseurs de VirtualCard, le linker me met des "undefined reference to" pour chaque appel à un accesseur de VirtualCard, mais aussi pour les éléments static de sa propre classe.

    Exemple:
    C:/.../Contacts/showcontact.cpp:110: undefined reference to `VirtualCard::note() const'

    VirtualCard et ShowContact sont dans le même dossier, les accesseurs sont bien dans la partie public, j'ai bien mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "virtualcard.h"
    dans showcontact.h

    Donc là je commence à être à cours d'idées sur ce qui peut déconner ou non.

    Dans le doute, si ça vient du .pro, je vous laisse juger:

    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
    # -------------------------------------------------
    # Project created by QtCreator 2009-08-10T14:52:16
    # -------------------------------------------------
    TARGET = Contacts
    TEMPLATE = lib
    DEFINES += CONTACTS_LIBRARY
    SOURCES += contacts.cpp \
        vcfreader.cpp \
        vcfwriter.cpp \
        virtualcard.cpp \
        vcfprocessor.cpp \
        showcontact.cpp
    HEADERS += contacts.h \
        Contacts_global.h \
        vcfreader.h \
        vcfwriter.h \
        virtualcard.h \
        vcfprocessor.h \
        showcontact.h
    RESOURCES += 
    FORMS +=

    Merci d'avance pour votre aide

    NewbieG33k

  2. #2
    Membre expérimenté Avatar de Firwen
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2009
    Messages : 472
    Points : 1 587
    Points
    1 587
    Par défaut
    Si j'ai entièrement compris ton problème, tu souhaites exporter du code dans une Lib et le charger ensuite dans ton programme principal.

    Il y a deux maniere de procéder :

    - La simple : tu ajoutes ta DLL et le header qui va avec à ton projet et tu le link grâce à la commande suivante dans ton .pro
    LIBS += -L/path/to/your/lib -lNameLib
    - soit tu crées ta Lib à l'aide de Wrappers afin de la rendre compatible 100% C et tu l'importes ensuite dynamiquement via QLibrary : ( doc ici )

    En espèrant avoir été compréhensible ^^

    Firwen
    It's not a bug, it's a feature

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    Merci pour cette réponse, mais ce n'est malheureusement pas là mon problème.

    Pour le moment je suis en train de développer la librairie dans un projet à part, et c'est ce projet qui ne veut plus compiler.
    Il est possible que j'ai à rencontrer le problème ultérieurement pour la mettre dans le programme principal, mais pour le moment, c'est l'export dans une lib qui me pose un souci.

    N'hésitez pas à me poser des questions pour un peu plus de détails si vous avez une idée de piste à explorer.

    Merci d'avance.

  4. #4
    Membre expérimenté Avatar de Firwen
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2009
    Messages : 472
    Points : 1 587
    Points
    1 587
    Par défaut
    Dans ce cas difficile à dire sans sortie compilateur ou code source sous la main ;-)
    It's not a bug, it's a feature

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 22
    Points
    22
    Par défaut
    Rebonjour,

    J'avais donné un bout de la sortie du compilateur dans mon premier post:

    Exemple:
    C:/.../Contacts/showcontact.cpp:110: undefined reference to `VirtualCard::note() const'
    Voici maintenant la sortie complète du compilateur pour un build normal effectué sous QtCreator.

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    Running build steps for project Contacts...
    Starting: C:/Dev/Qt/2009.3/qt/bin/qmake.exe C:/~/Contacts/Contacts.pro -spec win32-g++ -r 
    Exited with code 0.
    Starting: C:/Dev/Qt/2009.3/mingw/bin/mingw32-make.exe -w 
    mingw32-make: Entering directory `C:/~/Contacts'
    C:/Dev/Qt/2009.3/mingw/bin/mingw32-make -f Makefile.Debug
    mingw32-make[1]: Entering directory `C:/~/Contacts'
    g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -shared -Wl,--out-implib,debug\libContacts.a -o debug\Contacts.dll debug/contacts.o debug/vcfreader.o debug/vcfwriter.o debug/virtualcard.o debug/vcfprocessor.o debug/showcontact.o debug/moc_vcfprocessor.o debug/moc_showcontact.o -L"c:\Dev\Qt\2009.3\qt\lib" -lQtGuid4 -lQtCored4
    mingw32-make[1]: Leaving directory `C:/~/Contacts'
    mingw32-make: Leaving directory `C:/~/Contacts'
    debug/showcontact.o: In function `ZN11ShowContactC2EP11VirtualCardP7QWidget':
    C:/~/Contacts/showcontact.cpp:12: undefined reference to `VirtualCard::show() const'
    debug/showcontact.o: In function `ZN11ShowContactC1EP11VirtualCardP7QWidget':
    C:/~/Contacts/showcontact.cpp:12: undefined reference to `VirtualCard::show() const'
    debug/showcontact.o: In function `ZN11ShowContact10staticInitEv':
    C:/~/Contacts/showcontact.cpp:24: undefined reference to `ShowContact::StaticInit'
    debug/showcontact.o: In function `ZN11ShowContact13setStaticInitEb':
    C:/~/Contacts/showcontact.cpp:25: undefined reference to `ShowContact::StaticInit'
    debug/showcontact.o: In function `ZN11ShowContact4initEv':
    C:/~/Contacts/showcontact.cpp:29: undefined reference to `ShowContact::addressTypeChoices'
    C:/~/Contacts/showcontact.cpp:30: undefined reference to `ShowContact::phoneTypeChoices'
    debug/showcontact.o: In function `ZN11ShowContact13remplirChampsEv':
    C:/~/Contacts/showcontact.cpp:47: undefined reference to `VirtualCard::name() const'
    C:/~/Contacts/showcontact.cpp:48: undefined reference to `VirtualCard::name() const'
    C:/~/Contacts/showcontact.cpp:49: undefined reference to `VirtualCard::nickname() const'
    C:/~/Contacts/showcontact.cpp:52: undefined reference to `VirtualCard::birthday() const'
    C:/~/Contacts/showcontact.cpp:53: undefined reference to `VirtualCard::xanniversary() const'
    C:/~/Contacts/showcontact.cpp:59: undefined reference to `VirtualCard::address(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:60: undefined reference to `VirtualCard::address(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:61: undefined reference to `VirtualCard::address(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:62: undefined reference to `VirtualCard::address(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:63: undefined reference to `VirtualCard::address(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:64: undefined reference to `VirtualCard::labelAddress(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:65: undefined reference to `VirtualCard::address(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:66: undefined reference to `VirtualCard::address(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:67: undefined reference to `VirtualCard::address(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:68: undefined reference to `VirtualCard::address(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:69: undefined reference to `VirtualCard::address(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:70: undefined reference to `VirtualCard::labelAddress(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontCreating library file: debug\libContacts.a
    act.cpp:71: undefined reference to `VirtualCard::address(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:72: undefined reference to `VirtualCard::address(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:73: undefined reference to `VirtualCard::address(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:74: undefined reference to `VirtualCard::address(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:75: undefined reference to `VirtualCard::address(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:76: undefined reference to `VirtualCard::labelAddress(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:79: undefined reference to `ShowContact::addressTypeChoices'
    C:/~/Contacts/showcontact.cpp:82: undefined reference to `VirtualCard::tel(VCPhone::vcphone) const'
    C:/~/Contacts/showcontact.cpp:83: undefined reference to `VirtualCard::tel(VCPhone::vcphone) const'
    C:/~/Contacts/showcontact.cpp:84: undefined reference to `VirtualCard::tel(VCPhone::vcphone) const'
    C:/~/Contacts/showcontact.cpp:85: undefined reference to `VirtualCard::tel(VCPhone::vcphone) const'
    C:/~/Contacts/showcontact.cpp:86: undefined reference to `VirtualCard::tel(VCPhone::vcphone) const'
    C:/~/Contacts/showcontact.cpp:89: undefined reference to `ShowContact::phoneTypeChoices'
    C:/~/Contacts/showcontact.cpp:92: undefined reference to `VirtualCard::email(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:93: undefined reference to `VirtualCard::email(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:94: undefined reference to `VirtualCard::email(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:96: undefined reference to `ShowContact::addressTypeChoices'
    C:/~/Contacts/showcontact.cpp:97: undefined reference to `VirtualCard::xmsn() const'
    C:/~/Contacts/showcontact.cpp:100: undefined reference to `VirtualCard::url(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:101: undefined reference to `VirtualCard::url(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:102: undefined reference to `VirtualCard::url(VCAddr::vcaddr) const'
    C:/~/Contacts/showcontact.cpp:104: undefined reference to `ShowContact::addressTypeChoices'
    C:/~/Contacts/showcontact.cpp:107: undefined reference to `VirtualCard::logo() const'
    C:/~/Contacts/showcontact.cpp:108: undefined reference to `VirtualCard::logo() const'
    C:/~/Contacts/showcontact.cpp:111: undefined reference to `VirtualCard::note() const'
    collect2: ld returned 1 exit status
    mingw32-make[1]: *** [debug\Contacts.dll] Error 1
    mingw32-make: *** [debug] Error 2
    Exited with code 2.
    Error while building project Contacts
    When executing build step 'Make'
    Je mets en PJ les trois sources pouvant avoir un intérêt pour ce problème:
    • virtualcard.h : définition de la classe VirtualCard dont j'ai parlé
    • showcontact.h: définition de la classe ShowContact dont j'ai parlé
    • showcontact.cpp: implémentation de la classe ShowContact, c'est depuis que j'ai rempli ce fichier que la compilation plante au niveau de l'édition des liens


    NB: J'ai mis un #include "virtualcard.h" dans showcontact.cpp pour voir s'il y avait un problème à l'inclusion pour la référence, mais apparemment ça ne vient pas de là

    Pour ma part, je pense que ça vient du Makefile créé, mais franchement je ne sais pas s'il est modifiable sans risques, d'autant qu'il doit être généré régulièrement à priori...

    Merci pour le coup d'oeil
    Fichiers attachés Fichiers attachés

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Il n'arrive pas à trouver cette méthode. Est-ce qu'elle existe bien ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 22
    Points
    22
    Par défaut
    Bonsoir,

    Il n'arrive pas à voir des méthodes qui sont clairement définies, et pour preuve:
    • L'IDE a fait l'autocomplétion à chaque fois
    • J'ai défini toutes les méthodes de la classe VirtualCard avant de créer la classe ShowContact
    • Le linker est déjà tout simplement incapable de linker vers des attributs static de la classe appelante (ShowContact)


    Je viens de faire quelques tests supplémentaires:
    il semblerait que le problème avec les références venait des accesseurs que j'implémentais en tant que inline. Mes maigres cours de C++ m'avaient appris à m'en servir pour les accesseurs mais je ne sais plus trop comment. Apparemment, en mettant inline juste dans le .cpp, ça génère mes erreurs, mais si j'en mets un aussi dans le .h, ça ajoute des warnings.
    Par conséquent la question que je me pose maintenant est: Est-ce que le compilateur de Qt gère bien les éléments inline et static? Si oui, quelle(s) erreur(s) ai-je pu faire?

    Merci beaucoup

  8. #8
    Membre éprouvé

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Et si tu les mettais que dans .h ?
    Est-ce que le compilateur de Qt gère bien les éléments inline et static? Si oui, quelle(s) erreur(s) ai-je pu faire?
    Je pense que oui. C'est quand même des propriétés fondamentales du language. D'ailleurs, elles sont souvent utilisés dans le code même de Qt.

    Je pense que relire un petit cours ou une petite FAQ qur le sujet te donnerait toutes les réponses que tu attends .

    Bonne lecture,

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par newbiegeek Voir le message
    Par conséquent la question que je me pose maintenant est: Est-ce que le compilateur de Qt gère bien les éléments inline et static? Si oui, quelle(s) erreur(s) ai-je pu faire?
    Il n'y a pas de compilateur de Qt. C'est soit gcc soit Visual studio, et ils gèrent tus les keywords correctement. Maintenant si de ton côté tu as des problèmes avec inline, je te conseille de regarder cette discussion : http://www.developpez.net/forums/d79...-inline-h-cpp/ car tu as clairement le même problème de compréhension sur ce mot-clé

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    Merci pour vos réponses.
    Alors de ce que j'ai compris sur l'autre discussion vers laquelle vous m'avez envoyé, l'utilisation du inline semble désuète quand on veut créer une lib, donc je les ai supprimés, ça allège déjà les erreurs apparemment.

    Pour ce qui est des attributs static, l'erreur venait du fait qu'il n'aimait pas ma façon d'initialiser les variable apparemment...

    J'ai à nouveau réussi à obtenir ma dll, tant pis pour le inline.
    Je marque cette discussion comme résolue.

  11. #11
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par newbiegeek Voir le message
    Alors de ce que j'ai compris sur l'autre discussion vers laquelle vous m'avez envoyé, l'utilisation du inline semble désuète quand on veut créer une lib, donc je les ai supprimés, ça allège déjà les erreurs apparemment.
    Non, ce n'est pas pour une bibliothèque, c'est dans tous les cas : inline est un conseil, mais ça peut poser problème sur l'exposition de cette méthode à l'extérieur de l'unité de compilation. En mettant inline, on indique au compilateur qu'on ne va pas se servir de cette méthode à l'extérieur (puisqu'on dit qu'elle peut être inlinée, c'est dont qu'on ne l'appelle jamais directement). Bref, c'est un comportement logique et non pas désuet.

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

Discussions similaires

  1. probléme lors de la création de BD avec l'assistant graphique
    Par sajedose dans le forum Administration
    Réponses: 1
    Dernier message: 31/03/2008, 13h34
  2. Problèmes de timeout pour un script PHP avec Apache
    Par bluemartini dans le forum Apache
    Réponses: 2
    Dernier message: 11/07/2006, 16h16
  3. Problème création de DLL avec CString
    Par loupdeau dans le forum MFC
    Réponses: 3
    Dernier message: 21/07/2005, 20h55
  4. Problème unit CRT pour Faire du Pascal avec Delphi
    Par alexmorel dans le forum Débuter
    Réponses: 4
    Dernier message: 01/06/2004, 17h13

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