Qt and no moc_*.cpp file


I'm developing a simple Qt 4 app and making my own dialog. I subclassed QDialog, inserted the Q_OBJECT macro in the class declaration block, and... I get

[Linker error] undefined reference to `vtable for MyDialog' and there is no moc_MyDialog.cpp generated by the moc compiler.

I am using Qt 4.1.3 on Windows XP and mingw. I followed the build process from the Qt-supplied build shell. I used qmake to create make files and compiled everything with a make command.

I have other classes that subclass QPushButton and QObject respectively, but they compile OK. I can't find any differences between them and the broken one.

There must be missing something in the broken class, but I'm unable to spot it.

10/4/2017 2:47:28 PM

Accepted Answer

The undefined reference to "vtable for MyDialog" is caused because there is no moc file. Most c++ compilers create the vtable definition in the object file containing the first virtual function. When subclassing a qt object and using the Q_OBJECT macro, this will be in the moc*.cpp file. Therefore, this error means that the moc file is missing.

The possible problems I can think of are:

  1. The header file for the class MyDialog.h is not added to HEADERS in the qmake file.

  2. You ran qmake to generate the make file before adding the Q_OBJECT macro. This created a make file without the moc rules. This is easily fixed by simply running qmake again.

  3. Your dialog derives from more than one class and QDialog is not the first class that it derives from. For qmake to work correctly, the QObject derived base class needs to be the first class that is inherited from.

  4. If you are using Qt Creator, you might get this error if your previous deployment was failed due to some reason (like application already running). In that case, simply do a 'Clean Project' and then 'Rebuild Project' and then 'Run' to deploy.

5/29/2011 9:11:19 AM

If you have your header file included, follow the steps:

  1. Right click on the project where you have added this.
  2. Hit 'Run qmake'.

This will will clear up the old references and build with th Q_OBJECT macro. QT doesn't do it on rebuild.

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow