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"));
}
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.
Lorsque vous utilisez Qt Creator:
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.
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
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.
supprimé le dossier de construction, redémarré Qt Creator et tout fonctionnait
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.
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)
Une des causes est lorsque vous déclarez des fonctions virtuelles dans une classe et que vous ne définissez pas leur corps.
Dans mon cas, reconstruire tout ne suffisait pas, je devais supprimer le répertoire de construction et faire tout reconstruire - alors cela fonctionnait!
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.
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'ai eu le même problème en essayant d'utiliser une fonction virtuelle protégée. Deux choses ont fonctionné.
void process();
par void process() = 0;
process()
public au lieu de privé Allez dans le fichier .pro et assurez-vous que le fichier .h a 'include' avant . HEADERS + = include/file.h\ inclure/fichier2.h
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
.