web-dev-qa-db-fra.com

Référence non définie à vtable. Essayer de compiler un projet Qt

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

C:\Documents and Settings\Le fichier Fuzz\Desktop\GUI\App_interface.cpp | 33 | non défini référence à `vtable for AddressBook '

Fichier AddressBook.h:

 #ifndef ADDRESSBOOK_H
 #define ADDRESSBOOK_H

 #include <QWidget>

 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 <QtGui>
#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"));
}
49
TheFuzz

Attention: ne faites pas cela si vous avez déjà un fichier .pro - vous le perdrez!

Afin de vous assurer automatiquement que tous les fichiers moc cpp sont générés, vous pouvez demander à qmake de générer automatiquement un fichier .pro pour vous au lieu de l'écrire vous-même.

Courir

qmake -project

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

43
blwy10

Lorsque vous utilisez Qt Creator:

  1. Construire → Exécuter qmake
  2. Construire → Tout reconstruire
43
Anurag Verma

Le problème est presque certainement que vous ne compilez pas ou ne liez pas dans le fichier moc_AddressBook.cpp généré. (Il aurait dû être généré pour vous - vous utilisez la variable moc de Qt sur votre code avant la compilation, n'est-ce pas?)

Pour répondre plus en détail, la macro Q_OBJECT indique à l'outil moc de Qt de créer un fichier d'implémentation supplémentaire contenant le code nécessaire à la prise en charge du système de méta-informations de QObject. Si vous aviez des signaux ou des créneaux horaires, cela ferait quelques choses pour ceux-là aussi.

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

Aussi, je voudrais noter 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.

15

En supposant que vous utilisiez 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
9
Jeremy Friesner

Je l'ai eu en utilisant des fonctions virtuelles pures. Par exemple, "Processus virtuel void ();" A donné cette erreur, alors que "Processus virtuel void () = 0;" L'a fait disparaître .. ce problème, vérifiez-le d'abord .. .. J'utilise Netbeans avec le compilateur MinGW.

4
Jesse Victors

supprimé le dossier de construction, redémarré Qt Creator et tout fonctionnait

2
yolo

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. Le fichier moc correspondant manquait également dans le système de fichiers et dans la section Makefile "compiler_moc_header_make_all". J'ai couru un qmake puis finalement tout construit avec succès. Je suis allé vérifier le Makefile et c'était là maintenant.

2
yan bellavance

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)
2
Dumisani Kunene

Une des causes est lorsque vous déclarez des fonctions virtuelles dans une classe et que vous ne définissez pas leur corps.

1
agus

Dans mon cas, reconstruire tout ne suffisait pas, je devais supprimer le répertoire de construction et faire tout reconstruire - alors cela fonctionnait!

1
Alexey Petrenko

Je viens au même problème, reconstruire le projet jamais mettre à jour le Makefile, je supprime le Makefile et reconstruire, le problème est parti ps: exécuter "make" depuis la ligne de commande peut vous donner des informations plus détaillées que l'EDI, et utiles pour résoudre le vrai problème.

1
user281754

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.

0
Emil Fors

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

  1. Remplacer void process(); par void process() = 0; 
  2. Rendre process() public au lieu de privé 
0
khafen

Allez dans le fichier .pro et assurez-vous que le fichier .h a 'include' avant . HEADERS + = include/file.h\ inclure/fichier2.h

0
Phil

Simplement Run qmake pour votre projet. Cela peut être facilement fait en cliquant avec le bouton droit de la souris sur le nom de votre projet et en cliquant sur Run qmake.

0
Sunit Gautam