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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 très actif 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
    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

  3. #3
    Membre averti
    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
    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 très actif 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
    Par défaut
    Dans ce cas difficile à dire sans sortie compilateur ou code source sous la main ;-)

  5. #5
    Membre averti
    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
    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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

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

+ 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