Qt: les Signaux et les slots d'Erreur: undefined reference to `vtable for
Exemple suivant à partir de ce lien: http://developer.kde.org/documentation/books/kde-2.0-development/ch03lev1sec3.html
#include <QObject>
#include <QPushButton>
#include <iostream>
using namespace std;
class MyWindow : public QWidget
{
Q_OBJECT //Enable slots and signals
public:
MyWindow();
private slots:
void slotButton1();
void slotButton2();
void slotButtons();
private:
QPushButton *button1;
QPushButton *button2;
};
MyWindow :: MyWindow() : QWidget()
{
//Create button1 and connect button1->clicked() to this->slotButton1()
button1 = new QPushButton("Button1", this);
button1->setGeometry(10,10,100,40);
button1->show();
connect(button1, SIGNAL(clicked()), this, SLOT(slotButton1()));
//Create button2 and connect button2->clicked() to this->slotButton2()
button2 = new QPushButton("Button2", this);
button2->setGeometry(110,10,100,40);
button2->show();
connect(button2, SIGNAL(clicked()), this, SLOT(slotButton2()));
//When any button is clicked, call this->slotButtons()
connect(button1, SIGNAL(clicked()), this, SLOT(slotButtons()));
connect(button2, SIGNAL(clicked()), this, SLOT(slotButtons()));
}
//This slot is called when button1 is clicked.
void MyWindow::slotButton1()
{
cout << "Button1 was clicked" << endl;
}
//This slot is called when button2 is clicked
void MyWindow::slotButton2()
{
cout << "Button2 was clicked" << endl;
}
//This slot is called when any of the buttons were clicked
void MyWindow::slotButtons()
{
cout << "A button was clicked" << endl;
}
int main ()
{
MyWindow a;
}
résultats dans:
[13:14:34 Mon May 02] ~/junkPrograms/src/nonsense $make
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/opt/qtsdk-2010.05/qt/mkspecs/linux-g++-64 -I. -I/opt/qtsdk-2010.05/qt/include/QtCore -I/opt/qtsdk-2010.05/qt/include/QtGui -I/opt/qtsdk-2010.05/qt/include -I. -I. -o signalsSlots.o signalsSlots.cpp
g++ -m64 -Wl,-O1 -Wl,-rpath,/opt/qtsdk-2010.05/qt/lib -o nonsense signalsSlots.o -L/opt/qtsdk-2010.05/qt/lib -lQtGui -L/opt/qtsdk-2010.05/qt/lib -L/usr/X11R6/lib64 -lQtCore -lpthread
signalsSlots.o: In function `MyWindow::MyWindow()':
signalsSlots.cpp:(.text+0x1a2): undefined reference to `vtable for MyWindow'
signalsSlots.cpp:(.text+0x1aa): undefined reference to `vtable for MyWindow'
signalsSlots.o: In function `MyWindow::MyWindow()':
signalsSlots.cpp:(.text+0x3e2): undefined reference to `vtable for MyWindow'
signalsSlots.cpp:(.text+0x3ea): undefined reference to `vtable for MyWindow'
signalsSlots.o: In function `main':
signalsSlots.cpp:(.text+0x614): undefined reference to `vtable for MyWindow'
signalsSlots.o:signalsSlots.cpp:(.text+0x61d): more undefined references to `vtable for MyWindow' follow
collect2: ld returned 1 exit status
make: *** [nonsense] Error 1
vtable est pour des fonctions virtuelles, autant que je sache, quelle est la raison de l'erreur ici?
- Je ne vois pas quel est le problème, mais je tiens à souligner que le tutoriel que vous utilisez est assez obsolète. Je vous suggère de regarder les tutoriels Qt 4.7 documentation.
- merci mais le tut sur 4.7 ne présente pas de "course", par exemple, qui je le pouvais, collez et exécutez 🙁
- Double Possible de Qt moc avec des implémentations à l'intérieur des fichiers d'en-tête?
- Double Possible de Undefined reference to vtable. En essayant de compiler un projet Qt
Vous devez vous connecter pour publier un commentaire.
Il ressemble moc ne génère pas de code pour votre
QObject
parce que vous le déclarer dans le.cpp
fichier. La façon la plus simple de corriger cela est de déplacer la déclaration deMyWindow
d'en-tête, et ajouter l'en-tête de laHEADERS
liste, dans le .pro fichier:Puis exécutez à nouveau
qmake
.(Veuillez noter que le KDE 2.0 livre que vous regardez est largement dépassée)
#include "filename.moc"
à la fin de votre .fichier cpp et qmake va faire la bonne chose pour vous. C'est la pratique courante dans KDE, par exemple.Peut-être trop tard, mais... Eu le même problème et combattu pendant un certain temps à trouver d'où il vient.
Clic droit sur votre projet et sélectionnez “Exécuter qmake” à pour une nouvelle construction de la MOC classes. Il n'est généralement exécuter automatiquement...
La moc compilateur génère les talons et les appels en moc_xxxx.cpp et génère la vtable des trucs
qmake
pour moi n'arrange rien. Si je lanceqmake --project
alors qu'il régénère les.pro
et je peux compiler, mais que les tuyaux toutes les modifications apportées à la.pro
, qui est vraiment mauvais.Il suffit de Changer votre main() comme suit:
Basé sur andref commentaire juste au-dessus, quand tout est dans un fichier cpp comme
stuff.cpp
, vous devez ajouter à la fin du fichier:(c'est avec Qt 4.7.0)
Ce problème peut être causé par l'une des raisons suivantes. J'ai trébuché sur chacun d'eux de temps en temps.
Votre en-tête de classe peut-être à côté de la macro q_object. Ajouter la macro à l'en-tête comme déjà souligné par d'autres réponses.
Votre en-tête de classe ne peut pas être analysé par le moc. Ajouter le fichier d'en-tête dans les en-TÊTES des définitions de votre .pro (ou .pri) fichier de projet.
Si aucune de ce qui précède est vrai, alors vous avez probablement besoin d'exécuter qmake à nouveau pour s'assurer moc analyse l'en-tête de nouveau, juste au cas où la macro q_object a été ajouté dans l'en-tête après le qmake a été exécuté. Il suffit d'exécuter qmake nouveau.