这里我们有 test.cpp:
#include <QApplication>
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
单独放置在新目录中并:
$ qmake -project
$ qmake
$ make
它不起作用:
test.o: In function `MainWindow::~MainWindow()':
test.cpp:(.text._ZN10MainWindowD2Ev[_ZN10MainWindowD5Ev]+0x3): undefined reference to `vtable for MainWindow'
test.cpp:(.text._ZN10MainWindowD2Ev[_ZN10MainWindowD5Ev]+0xb): undefined reference to `vtable for MainWindow'
test.o: In function `main':
test.cpp:(.text.startup+0x48): undefined reference to `vtable for MainWindow'
test.cpp:(.text.startup+0x51): undefined reference to `vtable for MainWindow'
test.o: In function `MainWindow::~MainWindow()':
test.cpp:(.text._ZN10MainWindowD0Ev[_ZN10MainWindowD0Ev]+0x7): undefined reference to `vtable for MainWindow'
test.o:test.cpp:(.text._ZN10MainWindowD0Ev[_ZN10MainWindowD0Ev]+0xf): more undefined references to `vtable for MainWindow' follow
collect2: error: ld returned 1 exit status
make: *** [tmp] Error 1
一般来说,这样的错误要么是因为 moc 没有被调用,要么是因为未实现的虚拟方法。
moc 应该由 qmake 自动调用,而 afaik QMainWindow 没有任何纯虚拟方法 - 那么这里的问题是什么?
当我删除 Q_OBJECT 时,它可以工作。为什么是这样?到底是怎么回事?
我看到 Q_OBJECT 告诉 moc 为该对象生成信号/插槽元数据,为什么在这种情况下不能这样做?
更新:
解决方案是在类下面添加#include "test.moc"
:
#include <QApplication>
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
};
#include "test.moc" // <----------- HERE
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}