Search code examples
qtgccvtable

gcc compiles my Qt class with vtable undefined


I cannot get rid of the error "Undefined reference to vtable" when compiling my Linux desktop application.

I did find the thread Undefined reference to vtable

I have a

set(CMAKE_AUTOMOC ON)

in my CMakeLists.txt but I receive

AutoMoc warning
---------------
"SRC:/QtGUI/BASIC/SimulatorWindowBasic.cpp"
includes the moc file "SimulatorWindowBasic.moc", but does not contain a Q_OBJECT, Q_GADGET, Q_GADGET_EXPORT, Q_NAMESPACE or Q_NAMESPACE_EXPORT macro.

despite that my definition contains a Q_Object. At the end of build, I receive the feared message

/usr/bin/ld: CMakeFiles/Basic_GUI.dir/Basic_GUI.cpp.o: in function `main':
/Myhome/main/BASIC/Basic_GUI.cpp:6: undefined reference to `SimulatorWindowBasic::SimulatorWindowBasic(int, char**, QWidget*)'
/usr/bin/ld: CMakeFiles/Basic_GUI.dir/Basic_GUI.cpp.o: in function `SimulatorWindowBasic::~SimulatorWindowBasic()':

What do I wrong? Below I show my relevant sources.

(in my previous install using Qt5 and Ubuntu 20.04 I did not experience this issue. The present install uses Ubuntu 22.04 and Qt 6.4.2)

#ifndef SimulatorWindowBasic_H
#define SimulatorWindowBasic_H

#include <QMainWindow>

namespace Ui {
class SimulatorWindowBasic;
}

class SimulatorWindowBasic : public QMainWindow
{
    Q_OBJECT
public:
    explicit SimulatorWindowBasic(int argc, char **argv, QWidget *parent = 0);
    virtual ~SimulatorWindowBasic();
protected:
    Ui::SimulatorWindowBasic *ui;
};

#endif // SimulatorWindowBasic_H

and

#include "SimulatorWindowBasic.moc"
#include "SimulatorWindowBasic.h"
#include "uiSimulatorWindowBasic.h"


SimulatorWindowBasic::SimulatorWindowBasic(int argc, char **argv, QWidget *parent) :
    QMainWindow(parent),
     ui(new Ui::SimulatorWindowBasic)
{
    ui->setupUi(this);  // This creates the basic splitters
 }
 SimulatorWindowBasic::~SimulatorWindowBasic
 {
 }

Solution

  • You have to include "moc_SimulatorWindowBasic.cpp" because you want to have moc run on a header (and not on your source) as described in the cmake documentation