Référence indéfinie à vtable. Essayer de comstackr un projet Qt

J’utilise Code :: Blocks 8.02 et le compilateur mingw 5.1.6. Je reçois cette erreur lorsque je comstack mon projet Qt:

C: \ Documents and Settings \ La référence Fuzz \ Desktop \ GUI \ App_interface.cpp | 33 | indéfinie à `vtable for AddressBook ‘

Fichier AddressBook.h:

#ifndef ADDRESSBOOK_H #define ADDRESSBOOK_H #include  class QLabel; class QLineEdit; class QTextEdit; class AddressBook : public QWidget { Q_OBJECT public: AddressBook(QWidget *parent = 0); private: QLineEdit *nameLine; QTextEdit *addressText; }; #endif 

Fichier AddressBook.cpp:

 #include  #include "addressbook.h" AddressBook::AddressBook(QWidget *parent) : QWidget(parent) { QLabel *nameLabel = new QLabel(tr("Name:")); nameLine = new QLineEdit; QLabel *addressLabel = new QLabel(tr("Address:")); addressText = new QTextEdit; QGridLayout *mainLayout = new QGridLayout; mainLayout->addWidget(nameLabel, 0, 0); mainLayout->addWidget(nameLine, 0, 1); mainLayout->addWidget(addressLabel, 1, 0, Qt::AlignTop); mainLayout->addWidget(addressText, 1, 1); setLayout(mainLayout); setWindowTitle(tr("Simple Address Book")); } 

Attention: Ne le faites pas si vous avez déjà un fichier .pro – vous le perdrez!

Afin de s’assurer automatiquement que tous les fichiers moc cpp sont générés, vous pouvez obtenir que qmake génère automatiquement un fichier .pro pour vous au lieu d’en écrire un vous-même.

Courir

 qmake -project 

dans le répertoire du projet, et qmake parsingra votre répertoire pour tous les en-têtes et fichiers source C ++ pour générer des fichiers moc cpp.

Lors de l’utilisation de Qt Creator:

  1. Construire → Exécuter qmake
  2. Construire → Reconstruire tout

Le problème est presque certainement que vous ne comstackz pas ou ne liez pas le fichier moc_AddressBook.cpp généré. (Il aurait dû être généré pour vous – vous utilisez le moc de Qt sur votre code avant de le comstackr, non?)

Pour répondre un peu plus en profondeur, la macro Q_OBJECT signale à l’outil Q_OBJECT Qt de créer un fichier d’implémentation supplémentaire contenant le code nécessaire pour prendre en charge le QObject de méta-informations de QObject . Si vous aviez des signaux ou des créneaux, cela ferait aussi quelques choses pour ceux-là.

Une solution alternative pourrait être de supprimer la macro Q_OBJECT . Vous ne voulez probablement pas le faire, mais cela aiderait le problème immédiat, et ce n’est pas ssortingctement nécessaire avec le code que vous avez présenté.

Aussi, je noterais que votre ligne:

 #include "addressbook.h" 

Devrait probablement être:

 #include "AddressBook.h" 

en fonction de la façon dont vous avez présenté les noms de fichiers dans la question.

En supposant que vous utilisez qmake pour générer votre Makefile, assurez-vous que AddressBook.h est spécifié dans la variable HEADERS de votre fichier .pro, par exemple

 HEADERS = AddressBook.h 

Je l’ai eu en utilisant des fonctions virtuelles pures. Par exemple, “processus vide virtuel ()” a donné cette erreur, alors que “virtual void process () = 0;” fait disparaître. Pour ceux qui cherchent Google sur ce problème, vérifiez d’abord. J’utilise Netbeans avec le compilateur MinGW.

J’ai eu le même problème mais dès que j’ai défini mon constructeur dans le fichier d’en-tête au lieu du fichier .cpp, l’erreur a disparu. De plus, le fichier moc correspondant était manquant dans le système de fichiers et dans la section Makefile “comstackr_moc_header_make_all”. J’ai couru un qmake puis finalement tout construit avec succès. Je suis allé vérifier le Makefile et il était là maintenant.

supprimé le dossier de compilation, redémarré Qt Creator et cela a fonctionné

Je viens au même problème, reconstruire le projet ne jamais mettre à jour le Makefile, je supprime le Makefile et reconstruire, le problème est parti. ps: run ‘make’ à partir de la ligne de commande peut vous donner des informations détaillées que l’EDI, et utile pour obtenir le vrai problème.

Une des causes est lorsque vous déclarez une fonction virtuelle dans une classe et que vous ne définissez pas son corps.

Dans mon cas, Rebuild All ne suffisait pas, je devais supprimer le répertoire de compilation et faire Rebuild All – puis ça a fonctionné!

Pour les projets CMake, définissez CMAKE_AUTOMOC sur ON, cela a résolu mon problème.

 #Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) 

Accédez au fichier .pro et assurez-vous que le fichier .h est «inclus» avant lui. HEADERS + = include / file.h \ include / file2.h

J’ai eu le même problème en essayant d’utiliser une fonction virtuelle protégée. Deux choses ont fonctionné.

  1. Modification du void process(); void process() = 0;
  2. Rendre le process() public au lieu de privé

Vous obtiendrez le même message d’erreur si vous ajoutez accidentellement un prototype de destructeur. Ajoutez une définition de destructeur vide ou supprimez le prototype.

J’utilise Qt Creator pour comstackr et exécuter mes programmes, je n’utilise pas souvent l’ invite de commande Qt . Une chose que j’ai faite pour se débarrasser de l’erreur ennuyeuse ” vtable quelque chose quelque chose ” est d’append les lignes suivantes au fichier .pro .

TEMPLATE = app

QT + = core