Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Qt undefined reference to vtable [duplicate]

I am a beginner to Qt programming and use codeblocks for my programming. I created 3 files communicate.h,commmunicate.cpp and main.cpp as follows:

communicate.h

    #ifndef COMMUNICATE_H     #define COMMUNICATE_H      #include <QWidget>     #include <QApplication>     #include <QPushButton>     #include <QLabel>      class Communicate : public QWidget     {       Q_OBJECT        public:         Communicate(QWidget *parent = 0);         private slots:         void OnPlus();         void OnMinus();        private:         QLabel *label;      };      #endif 

communicate.cpp

#include "communicate.h"  Communicate::Communicate(QWidget *parent)     : QWidget(parent) {   QPushButton *plus = new QPushButton("+", this);   plus->setGeometry(50, 40, 75, 30);    QPushButton *minus = new QPushButton("-", this);   minus->setGeometry(50, 100, 75, 30);    label = new QLabel("0", this);   label->setGeometry(190, 80, 20, 30);    connect(plus, SIGNAL(clicked()), this, SLOT(OnPlus()));   connect(minus, SIGNAL(clicked()), this, SLOT(OnMinus())); }  void Communicate::OnPlus() {   int val = label->text().toInt();   val++;   label->setText(QString::number(val)); }  void Communicate::OnMinus() {   int val = label->text().toInt();   val--;   label->setText(QString::number(val)); } 

main.cpp

#include "communicate.h"  int main(int argc, char *argv[]) {   QApplication app(argc, argv);    Communicate window;    window.setWindowTitle("Communicate");   window.show();    return app.exec(); } 

and its showing errors as follows:

obj\Debug\main.o(.text$_ZN11CommunicateD1Ev[Communicate::~Communicate()]+0xb)||In function `ZN7QStringC1EPKc':| C:\Qt\4.4.3\include\QtCore\..\..\src\corelib\arch\qatomic_windows.h||undefined reference to `vtable for Communicate'| obj\Debug\main.o(.text$_ZN11CommunicateD1Ev[Communicate::~Communicate()]+0x17):C:\Qt\4.4.3\include\QtCore\..\..\src\corelib\arch\qatomic_windows.h||undefined reference to `vtable for Communicate'| obj\Debug\communicate.o(.text+0x172)||In function `ZN11CommunicateC2EP7QWidget':| E:\Project\cam2\communicate.cpp|5|undefined reference to `vtable for Communicate'| obj\Debug\communicate.o(.text+0x17e):E:\Project\cam2\communicate.cpp|5|undefined reference to `vtable for Communicate'| obj\Debug\communicate.o(.text+0x63a)||In function `ZN11CommunicateC1EP7QWidget':| E:\Project\cam2\communicate.cpp|5|undefined reference to `vtable for Communicate'| obj\Debug\communicate.o(.text+0x646):E:\Project\cam2\communicate.cpp|5|more undefined references to `vtable for Communicate' follow| ||=== Build finished: 6 errors, 0 warnings ===| 

guys please help...cant figure it out...

like image 856
ranger101 Avatar asked Dec 23 '12 12:12

ranger101


1 Answers

This is a subtle bug (and probably partly at least a compiler bug) that I've seen before. Since QWidget has a virtual destructor, the compiler needs a vtable for your class. But your class doesn't have any virtual functions, so it didn't build one for your Communicate class.

Add a virtual ~Communicate() {}; to your class, and all will be well.

Yes, it took me some time to figure this out too!

like image 53
Mats Petersson Avatar answered Oct 16 '22 12:10

Mats Petersson