如何正确解决“未定义的vtable引用”错误?

时间:2011-02-01 16:16:37

标签: c++ qt constructor vtable

我已经阅读了常见问题和其他几个网站,但我似乎无法找到合适的解决方案。我很确定你之前已经听过这个问题了,如果可能的话,我想就如何解决这个问题寻求具体的帮助。

具体错误是: 错误:未定义引用`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()
{}

如果有人能告诉我该如何解决这个问题,我将非常感激。提前致谢。 :)

5 个答案:

答案 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菜单下。