Qt et pas de moc_*.fichier cpp
Je suis l'élaboration d'un simple Qt 4 application et de faire mon propre boîte de dialogue. Je sous-classé QDialog
, inséré le Q_OBJECT
macro dans la déclaration de classe, d'un bloc, et... je reçois
[Linker error] undefined reference to `vtable pour MyDialog " et il n'y a pas de
moc_MyDialog.rpc généré par le moc compilateur.
Je suis à l'aide de Qt 4.1.3 sur Windows XP et mingw. J'ai suivi le processus de construction de l'intervalle Qt fourni construire shell. J'ai utilisé qmake pour créer de rendre les fichiers et compilé le tout avec une commande make.
J'ai d'autres classes que la sous-classe QPushButton
et QObject
respectivement, mais la compilation est OK. Je ne trouve pas de différences entre eux et le cassé.
Il doit manquer quelque chose dans le cassé de la classe, mais je suis incapable de le repérer.
OriginalL'auteur | 2008-10-07
Vous devez vous connecter pour publier un commentaire.
Le undefined reference to "vtable pour MyDialog" est due, car il n'existe pas de fichier moc. La plupart des compilateurs c++ créer la vtable définition dans le fichier d'objet contenant la première fonction virtuelle. Lorsque le sous-classement d'un objet de qt et à l'aide de la macro q_object, ce sera dans la moc*.fichier cpp. Par conséquent, cette erreur signifie que le moc fichier est manquant.
Les éventuels problèmes que je peux penser sont:
Le fichier d'en-tête pour la classe MyDialog.h n'est pas ajouté à l'en-tête dans le fichier qmake.
Vous avez exécuté qmake pour générer le fichier de créer avant l'ajout de la macro q_object. Cela a créé un fichier sans le moc règles. C'est facilement résolu par la simple exécution de qmake nouveau.
Votre boîte de dialogue dérive de plus d'une classe et de QDialog n'est pas le premier de la classe qu'il dérive d'. Pour qmake pour fonctionner correctement, le QObject dérivée de la classe de base doit être le premier de la classe qui hérite.
Si vous êtes à l'aide de Qt Creator, vous pouvez obtenir cette erreur si votre déploiement précédent a échoué pour une raison quelconque (comme l'application déjà en cours d'exécution). Dans ce cas, il suffit de faire un "Nettoyage de Projet "puis" Projet de Reconstruction de "et ensuite" Exécuter " de déployer.
Aussi: ne pas avoir
QT += gui
dans le.pro
fichier me donne ce comportement avec Qt 4.7.4.qmake est à la recherche pour les en-têtes uniquement dans le répertoire courant, donc, si l'en-tête est dans l'autre répertoire, vous devez spécifier le chemin d'accès complet dans les en-TÊTES.
le nom de chemin complet doit être là, c'est à dire: les en-TÊTES += src/*.h l'habitude de travailler, vous devez les en-TÊTES += src/métafichier.h
OriginalL'auteur David Dibben
Si vous avez votre fichier d'en-tête inclus, suivez les étapes:
Cela va effacer les anciennes références et de construire avec th macro q_object. QT ne pas le faire à la reconstruction.
OriginalL'auteur Kamrul
J'ai constater que le problème apparaît que lorsqu'il est ajouté une classe sans extension, puis une extension est ajoutée manuellement.
Pour résoudre le problème j'ai mis macro q_object dans le .h de la classe, puis clic droit sur "Sources" -> "Ajouter des Fichiers..." les choix de la .ccp de mon modifiés de classe.
OriginalL'auteur Bemipefe
Êtes-vous à l'aide de qmake? Peut-être que vous n'avez pas l'ajouter à votre la .fichier cpp pour vos SOURCES et .h fichier vos en-TÊTES de variable dans le fichier qmake?
OriginalL'auteur user24560
Je humblement vous suggérons d'utiliser CMake pour la construction de l'intervalle Qt de programmes sur Windows. Il gardera de vous n'oubliez pas d'ajouter des fichiers à ses fichiers de build.
La valeur supplémentaire est que vous pouvez générer à faire/nmake construire des fichiers à partir d'elle, de solutions de Visual Studio fichiers. Et si vous compiler Qt à partir des sources pour Visual Studio, vous serez en mesure à la fois le code et construire avec MME IDE/compilateur.
C'est bien sûr, si vous utilisez Visual Studio.
OriginalL'auteur Marcin Gil
Le message undefined reference to `vtable pour MyDialog peut également être le résultat d'un manque de mise en oeuvre (MyDialog) d'une fonction virtuelle pure dans une classe qui MyDialog est dérivé.
OriginalL'auteur jelle foks