Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

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 this

    connect(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 this

    connect(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......


  • Qt Champions 2019

    @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>..



  • @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


  • Qt Champions 2019

    @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).


  • Qt Champions 2019

    @qazaq408 But how did you add the Dialog class? Manually?





  • I'm only one who use Qt in my company.....
    I cast two days on this queston and can't do anything..
    My Boss Is angry ....
    Who can help me.....



  • Delete the build folder and re-run qmake. your code is fine



  • 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.
    alt text


  • Qt Champions 2019

    @qazaq408 Can you show your pro file?



  • @jsulm

    #-------------------------------------------------
    #
    # 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


  • Qt Champions 2019

    @qazaq408 Does MocTest.* contain your Dialog class?



  • @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()
    {
    
    }
    

  • Moderators

    @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 of dialog.h and dialog.cpp

    #ifndef DIALOG_H
    #define DIALOG_H

    you 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


  • Lifetime Qt Champion

    @qazaq408

    I have two suggestions for you:

    1. 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.
    2. Upload your complete project somewhere so we can test it.

    Regards



  • @J.Hilk
    I guess that's is the point, MOC tools can't prduce moc*.cpp file
    alt text
    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...


  • Lifetime Qt Champion

    @qazaq408 said in SOS:undefined reference to `vtable for<class name>:

    I guess that's is the point, MOC tools can't prduce moc*.cpp file

    Then please do clean all build artefacts, and then compile your project. Paste the compile log here for analysis.

    PS: Also make sure that there are no Makefile, *.moc, *.o and other generated files in your source directory! This will lead to the strangest effects possible.



  • @aha_1980
    I had done this....
    even I cpoy these three file (Moctst.h,MocTest.cpp,Main.cpp) to another dir,like E:/tk

    and use cmd.exe
    /////
    e:
    cd ./tk
    moc MocTest.h -o Moc_MocTest.cpp

    the system tell me .E:\tk\MocTest.h:1: Note: No relevant classes found. No output generated....


  • Qt Champions 2019

    @qazaq408 Don't copy anything, just create a new project and add there a new dialog and see whether it works.



  • @jsulm
    if I create a new object that has a new dialog,(I don't revise anything and the class with Q_OBJECT marco),and make,
    system tell me
    alt text

    and if i delete Q_OBJECT marco,it works ,but still has a question
    alt text


  • Moderators

    @qazaq408

    1. Restart your PC
    2. Open Qt Creator
    3. In the "Welcome" screen, click "Examples"
    4. Search for the "Address Book Example"
    5. Try to run this example

    What do you see?



  • I take it...my company systm file are encrypted so that add some question when Qt produce .o file. I run win7 in the vritulBox and it's work!!!!!

    Thank brother Chun,
    Thank god
    Thank everyone who help me or not,thank you cost so much time to answer my question.

    thank you!!


Log in to reply