我已经阅读了常见问题和其他几个网站,但我似乎无法找到合适的解决方案。我很确定你之前已经听过这个问题了,如果可能的话,我想就如何解决这个问题寻求具体的帮助。
具体错误是: 错误:未定义引用`vtable for FGui' 它始终指向fgui.cpp中的构造函数,但我没有看到任何可能出错的内容。
FGui是一个继承自名为“FFoo”的类的类,它继承自QMainWindow。 相关代码:
(在ffoo.h中:)
class Ffoo : public QMainWindow
{
Q_OBJECT
public:
Ffoo();
~Ffoo();
(...)
};
(在ffoo.cpp:中)
Ffoo::Ffoo()
{
textEdit = 0;
tcpSock = 0;
setupConnectBox();
}
Ffoo::~Ffoo()
{}
FGui文件仍然很简单,因为我最近才开始上课。
(fgui.h:)
class FGui : public Ffoo
{
Q_OBJECT
public:
FGui();
~FGui();
};
(fgui.cpp:)
FGui::FGui() : Ffoo()
{}
FGui::~FGui()
{}
如果有人能告诉我该如何解决这个问题,我将非常感激。提前致谢。 :)
答案 0 :(得分:5)
尝试重新运行qmake。如果你使用Qt Creator,清理项目(Build / Clean All),然后选择Build / Run qmake。这通常有助于这种情况。
答案 1 :(得分:3)
你需要moc你的FGui和Ffoo课程。
答案 2 :(得分:3)
您需要针对源文件运行moc 。如果您使用 qmake 创建了makefile,只要在.pro文件中包含.cpp和.h文件,就会自动发生这种情况。您可能忘记了其中一个步骤。请注意,如果您的类在上次运行qmake期间未包含Q_OBJECT宏,则只运行make不会调用moc来运行。您需要再次运行qmake 才能这样做!
然后会发生以下过程:如果运行“make”,不仅会编译.cpp文件,而且还会通过moc(元对象编译器)创建一个额外的.cpp文件,然后进行编译。第二个.cpp文件包含信号的实现。注意,信号是实际上普通的方法,它将呼叫“转发”到连接的时隙(或信号)。这个实现是moc生成的(除其他外)。即使你的类不包含信号,由于一些内部使用的(?)虚函数,类需要有一个vtable ...但是,如果源文件包含基于QObject的类,则需要运行moc。 / p>
答案 3 :(得分:2)
对vtable的未定义引用意味着您没有实现纯虚方法。它可能是Ffoo中的纯虚方法,你忘了在FGui中实现,或者如果你使用信号,也许你没有使用元对象编译器(它将实现缺少的方法),正如其他人所说的那样。 p>
答案 4 :(得分:2)
在开发源文件的后期添加Q_OBJECT宏时,通常会得到此信息。 Makefile还没有认为你必须moc文件,所以它没有,你得到这些vtable错误。正如其他人所说,只需重新运行qmake。如果你正在使用Creator,它就在Build菜单下。