一般我们继承QObject类在头文件中添加,但是有时候需要在源文件中添加。这样就会不可避免地出现编译错误。那么我们该究竟怎么解决它呢?
问题重现
执行下列源码会报以下错误:
1
2error: undefined reference to `vtable for Object'
错误: 未定义引用'Object'的虚函数表问题源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15/* main.cpp */
class Object : public QObject {
Q_OBJECT
public:
Object() { }
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Object object;
return a.exec();
}
问题分析
- 这是Qt的moc工具不识别cpp导致。
- 由于moc工具不识别cpp文件中继承于QObject的类,这样就不能自动为该类添加一些实现函数(元对象函数),就会导致
函数未定义的错误
。 - 当qmake运行起来时,moc工具会自动识别处理头文件中所有继承于QObject的类和一系列Qt元对象属性。
- 要想让moc识别cpp文件,只需要包含
#include 当前文件.moc
就可以了。
解决步骤(方法)
- 包含
当前文件.moc
到其类定义下或最后一行(注意:不能Object类先于定义); - 清除项目->qmake->编译。
- 修正源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17/* main.cpp */
class Object : public QObject {
Q_OBJECT
public:
Object() { }
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Object object;
return a.exec();
}