SOS:undefined reference to `vtable for<class name>
-
WIN7 + MingW32 + Qt5.7
P1
I build a custom class by Qt Creator.
New File Or Project->choose Qt Widgets Application->->set name and son on(I belive you have done much times). Idon.t change any code and clicke "run",then QtCreator tell me "undefined reference to `vtable for<class name>"p2
I delete macro "Q_OBJECT",and click "run",then the programme is running normal...
P3
I put a QPushButton on the dialog(Now the dialog without Q_OBJECT marco),and add the code like thisconnect(cancel_PushButton,SIGNAL(clicked()),this,SLOT(close()));
I run the programme again ,and everything is OK,when I click "cancel" Button,the dialod is closed......You know ,this custom dialog(inheriten QDialog) haven't Q_OBJECT marco now.But it alose can use signals and slots....
P3
I add Q_OBJECT marco into custom dialog,and run the programme,the QtCreator tell me "undefined reference to `vtable for<class name>"....P4
I delete Q_OBJECT marco again ,and put another QPushButton on dialog,and add a custom slots,the code look like thisconnect(test_PushButton,SIGNAL(clicked()),this,SLOT(myTest()));
and when I compile , QtCreator tell me
QObject::connect: No such slot QDialog::myTest() in ....
but the programme still can run ,and when I click "cancel"pushButton,the programme is closed...P5
For make custom slots(myTest()) work,I add Q_OBJECT marco again ,and when I run this pro ,Qt creator tell me undefined reference to `vtable for<class name>...By google,someont tell me delete moc file and qmake again.I delete all file besides .h and .cpp fie,but when I build the programme,Qt Creator still tell me undefined reference to `vtable for<class name>...
anther one tell me when I put Q_OBJECT marco in the .cpp file ,it will lead to this ,but I write Q_OBJECT marco in the .h file..
what can i do......
-
WIN7 + MingW32 + Qt5.7
P1
I build a custom class by Qt Creator.
New File Or Project->choose Qt Widgets Application->->set name and son on(I belive you have done much times). Idon.t change any code and clicke "run",then QtCreator tell me "undefined reference to `vtable for<class name>"p2
I delete macro "Q_OBJECT",and click "run",then the programme is running normal...
P3
I put a QPushButton on the dialog(Now the dialog without Q_OBJECT marco),and add the code like thisconnect(cancel_PushButton,SIGNAL(clicked()),this,SLOT(close()));
I run the programme again ,and everything is OK,when I click "cancel" Button,the dialod is closed......You know ,this custom dialog(inheriten QDialog) haven't Q_OBJECT marco now.But it alose can use signals and slots....
P3
I add Q_OBJECT marco into custom dialog,and run the programme,the QtCreator tell me "undefined reference to `vtable for<class name>"....P4
I delete Q_OBJECT marco again ,and put another QPushButton on dialog,and add a custom slots,the code look like thisconnect(test_PushButton,SIGNAL(clicked()),this,SLOT(myTest()));
and when I compile , QtCreator tell me
QObject::connect: No such slot QDialog::myTest() in ....
but the programme still can run ,and when I click "cancel"pushButton,the programme is closed...P5
For make custom slots(myTest()) work,I add Q_OBJECT marco again ,and when I run this pro ,Qt creator tell me undefined reference to `vtable for<class name>...By google,someont tell me delete moc file and qmake again.I delete all file besides .h and .cpp fie,but when I build the programme,Qt Creator still tell me undefined reference to `vtable for<class name>...
anther one tell me when I put Q_OBJECT marco in the .cpp file ,it will lead to this ,but I write Q_OBJECT marco in the .h file..
what can i do......
@qazaq408 said in SOS:undefined reference to `vtable for<class name>:
what can i do
You can show us your code.
Also, delete the build directory, run qmake and then build again. -
@qazaq408 said in SOS:undefined reference to `vtable for<class name>:
what can i do
You can show us your code.
Also, delete the build directory, run qmake and then build again.@jsulm
.h file#ifndef DIALOG_H #define DIALOG_H #include <QDialog> class Dialog : public QDialog { Q_OBJECT public: Dialog(QWidget *parent = 0); ~Dialog(); }; #endif // DIALOG_H
.cpp file
#include "Dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent) { } Dialog::~Dialog() { }
main file
#include "Dialog.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Dialog w; w.show(); return a.exec(); }
When I compile by Qt Creator ,it tell me undefined reference to `vtable for<class name>..
Also, delete the build directory, run qmake and then build again.
I had tried to do this... even I copy three file to another independent dir , but it still show undefined reference to `vtable for<class name>..
-
@qazaq408 said in SOS:undefined reference to `vtable for<class name>:
what can i do
You can show us your code.
Also, delete the build directory, run qmake and then build again. -
@jsulm
If I delete Q_OBJECT marco,the programme can run,but QtCreator has a question"D:\vbox\untitled\Dialog.h:1: Note: No relevant classes found. No output generated."
I can sure the encode is UTF-8
-
@qazaq408 "New File Or Project->choose Qt Widgets Application" - I guess you mean "C++ class" not "Qt Widgets Application" or how did you add the dialog to your application?
-
@jsulm
I can sure I choose Qt Widgets Application...and I also add dialog to my app
if not ,it can't work (after delete Q_OBJECT marco). -
I get more infomation by google...
I try puoduce Moc file by moc tools
moc doc.h -o Moc_doc.cpp
but system always tell me "F:\doc\Doc\Doc.h:1: Note: No relevant classes found. No output generated."
I change the encode of .h file by notepad++,whatever I use utf-8 or ansi,It doesn't work.
-
I get more infomation by google...
I try puoduce Moc file by moc tools
moc doc.h -o Moc_doc.cpp
but system always tell me "F:\doc\Doc\Doc.h:1: Note: No relevant classes found. No output generated."
I change the encode of .h file by notepad++,whatever I use utf-8 or ansi,It doesn't work.
-
#------------------------------------------------- # # Project created by QtCreator 2018-06-13T12:39:42 # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = MocTest TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp \ MocTest.cpp HEADERS += \ MocTest.h
The .h and .cpp file one the 3th floor
-
#------------------------------------------------- # # Project created by QtCreator 2018-06-13T12:39:42 # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = MocTest TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp \ MocTest.cpp HEADERS += \ MocTest.h
The .h and .cpp file one the 3th floor
-
@jsulm
no,My class name "MocTest; and "MocTest" class inheriten QDialog
and I write class declaration inthe .h file,wirte class definition in .cpp file.h file
#ifndef DIALOG_H #define DIALOG_H #include <QDialog> class Dialog : public QDialog { Q_OBJECT public: Dialog(QWidget *parent = 0); ~Dialog(); }; #endif // DIALOG_H
.cpp file
#include "Dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent) { } Dialog::~Dialog() { }
-
@jsulm
no,My class name "MocTest; and "MocTest" class inheriten QDialog
and I write class declaration inthe .h file,wirte class definition in .cpp file.h file
#ifndef DIALOG_H #define DIALOG_H #include <QDialog> class Dialog : public QDialog { Q_OBJECT public: Dialog(QWidget *parent = 0); ~Dialog(); }; #endif // DIALOG_H
.cpp file
#include "Dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent) { } Dialog::~Dialog() { }
@qazaq408 said in SOS:undefined reference to `vtable for<class name>:
@jsulm
no,My class name "MocTest; and "MocTest" class inheriten QDialog
and I write class declaration inthe .h file,wirte class definition in .cpp file.h file
#ifndef DIALOG_H #define DIALOG_H #include <QDialog> class MocTest : public QDialog { Q_OBJECT public: MocTest(QWidget *parent = 0); ~MocTest(); }; #endif // DIALOG_H
.cpp file
#include "MocTest.h" MocTest::MocTest(QWidget *parent) : QDialog(parent) { } MocTest::~MocTest() { }
-
@qazaq408 said in SOS:undefined reference to `vtable for<class name>:
@jsulm
no,My class name "MocTest; and "MocTest" class inheriten QDialog
and I write class declaration inthe .h file,wirte class definition in .cpp file.h file
#ifndef DIALOG_H #define DIALOG_H #include <QDialog> class MocTest : public QDialog { Q_OBJECT public: MocTest(QWidget *parent = 0); ~MocTest(); }; #endif // DIALOG_H
.cpp file
#include "MocTest.h" MocTest::MocTest(QWidget *parent) : QDialog(parent) { } MocTest::~MocTest() { }
@qazaq408 said in SOS:undefined reference to `vtable for<class name>:
somthing strange is going on, did you create the class files yourself? because the declaration guards are QtNorming conform and indicate file names ofdialog.h
anddialog.cpp
#ifndef DIALOG_H
#define DIALOG_Hyou didn't just write
SOURCES += MocTest.cpp
because you named your class MocTest, and the file itself is named dialog.cpp, right?
Just made a basic test program and works fine, as expected:
//*pro #------------------------------------------------- # # Project created by QtCreator 2018-06-15T07:01:09 # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = MocTest TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp \ moctest.cpp HEADERS += \ mainwindow.h \ moctest.h
//main.cpp #include "moctest.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MocTest test; test.show(); return a.exec(); }
//moctest.h #ifndef MOCTEST_H #define MOCTEST_H #include <QDialog> class MocTest : public QDialog { Q_OBJECT public: explicit MocTest(QDialog *parent = 0); }; #endif // MOCTEST_H
//MocTest.cpp #include "moctest.h" MocTest::MocTest(QDialog *parent) : QDialog(parent) { }
-
@qazaq408 said in SOS:undefined reference to `vtable for<class name>:
somthing strange is going on, did you create the class files yourself? because the declaration guards are QtNorming conform and indicate file names ofdialog.h
anddialog.cpp
#ifndef DIALOG_H
#define DIALOG_Hyou didn't just write
SOURCES += MocTest.cpp
because you named your class MocTest, and the file itself is named dialog.cpp, right?
Just made a basic test program and works fine, as expected:
//*pro #------------------------------------------------- # # Project created by QtCreator 2018-06-15T07:01:09 # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = MocTest TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp \ moctest.cpp HEADERS += \ mainwindow.h \ moctest.h
//main.cpp #include "moctest.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MocTest test; test.show(); return a.exec(); }
//moctest.h #ifndef MOCTEST_H #define MOCTEST_H #include <QDialog> class MocTest : public QDialog { Q_OBJECT public: explicit MocTest(QDialog *parent = 0); }; #endif // MOCTEST_H
//MocTest.cpp #include "moctest.h" MocTest::MocTest(QDialog *parent) : QDialog(parent) { }
-
@J.Hilk
I make a mistake when i reply...I'm in a hurry because my boss is kicking my ass....my class name "MocTest",it's inheriten QDialog,and "MocTest" class is writed in MocTest.h and MocTest,cpp
I have two suggestions for you:
- Create a completely new project from QtCreators wizards and see if you can compile it. Then add a dialog (also with the wizard) and see if it still works. If not, than something may be wrong with your setup.
- Upload your complete project somewhere so we can test it.
Regards
-
@qazaq408 said in SOS:undefined reference to `vtable for<class name>:
somthing strange is going on, did you create the class files yourself? because the declaration guards are QtNorming conform and indicate file names ofdialog.h
anddialog.cpp
#ifndef DIALOG_H
#define DIALOG_Hyou didn't just write
SOURCES += MocTest.cpp
because you named your class MocTest, and the file itself is named dialog.cpp, right?
Just made a basic test program and works fine, as expected:
//*pro #------------------------------------------------- # # Project created by QtCreator 2018-06-15T07:01:09 # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = MocTest TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp \ moctest.cpp HEADERS += \ mainwindow.h \ moctest.h
//main.cpp #include "moctest.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MocTest test; test.show(); return a.exec(); }
//moctest.h #ifndef MOCTEST_H #define MOCTEST_H #include <QDialog> class MocTest : public QDialog { Q_OBJECT public: explicit MocTest(QDialog *parent = 0); }; #endif // MOCTEST_H
//MocTest.cpp #include "moctest.h" MocTest::MocTest(QDialog *parent) : QDialog(parent) { }
@J.Hilk
I guess that's is the point, MOC tools can't prduce moc*.cpp file
But I don't know why .
the almost answer in google is that the encode of file is wrong,qt need utf-8,but i change the encode of .h file by vs and notepad++, it still don't work...