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

C++ 如何正确解决“未定义对vtable的引用”错误?,c++,qt,constructor,vtable,C++,Qt,Constructor,Vtable,我已经阅读了FAQ和其他一些网站,但是我似乎找不到合适的解决方案。我很确定你以前听过这个问题,如果可能的话,我想寻求具体的帮助来解决这个问题 具体错误是: 错误:未定义对“FGui的vtable”的引用 它总是指向fgui.cpp中的构造函数,但我看不出有什么问题 FGui是从名为FFoo的类继承的类,该类是从QMainWindow继承的。 相关代码: 在ffoo.h中: class Ffoo : public QMainWindow { Q_OBJECT public: Ffoo();

我已经阅读了FAQ和其他一些网站,但是我似乎找不到合适的解决方案。我很确定你以前听过这个问题,如果可能的话,我想寻求具体的帮助来解决这个问题

具体错误是: 错误:未定义对“FGui的vtable”的引用 它总是指向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()
{}

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

您需要更新FGui和Ffoo类。

您需要更新FGui和Ffoo类。

尝试重新运行qmake。如果使用QtCreator,请清除项目生成/全部清除,然后选择生成/运行qmake。在这种情况下,这通常会有所帮助。

尝试重新运行qmake。如果使用QtCreator,请清除项目生成/全部清除,然后选择生成/运行qmake。在这种情况下,这通常会有所帮助。

未定义对vtable的引用意味着您没有实现纯虚拟方法。它可能是Ffoo中的纯虚拟方法,您忘记在FGui中实现,或者,如果您使用的是信号,则可能您没有使用元对象编译器来实现缺少的方法,正如其他人所述。

未定义对vtable的引用意味着您没有实现纯虚拟方法。它可能是Ffoo中的纯虚拟方法,您忘记在FGui中实现,或者,如果您使用的是信号,则可能您没有使用元对象编译器来实现缺少的方法,正如其他人所说。

您需要对源文件运行moc。如果使用qmake创建makefile,只要在.pro文件中包含.cpp和.h文件,就会自动发生这种情况。您可能忘记了其中一个步骤。请注意,如果您的类在上次运行qmake期间没有包含Q_对象宏,那么简单地运行make不会调用moc来运行。您需要再次运行qmake才能执行此操作

然后发生的是以下过程:如果运行make,不仅会编译.cpp文件,还会由moc元对象编译器创建一个附加的.cpp文件,然后再编译。第二个.cpp文件包含信号的实现。请注意,信号实际上是将调用转发到连接的插槽或信号的普通方法。这种实现是主运行中心产生的。即使您的类不包含信号,由于一些内部使用的虚拟函数,这些类也需要有vtable。。。但是,如果源文件包含基于QObject的类,则确实需要运行moc。

您需要对源文件运行moc。如果使用qmake创建makefile,只要在.pro文件中包含.cpp和.h文件,就会自动发生这种情况。您可能忘记了其中一个步骤。请注意,如果您的类在上次运行qmake期间没有包含Q_对象宏,那么简单地运行make不会调用moc来运行。您需要再次运行qmake才能执行此操作


然后发生的是以下过程:如果运行make,不仅会编译.cpp文件,还会由moc元对象编译器创建一个附加的.cpp文件,然后再编译。第二个.cpp文件包含信号的实现。请注意,信号实际上是将调用转发到连接的插槽或信号的普通方法。这种实现是主运行中心产生的。即使您的类不包含信号,由于一些内部使用的虚拟函数,这些类也需要有vtable。。。但是,如果源文件包含基于QObject的类,则确实需要运行moc。

在源文件开发后期添加Q_对象宏时,通常会出现这种情况。Makefile还不认为您必须对文件进行moc,因此它不认为您必须对文件进行moc,并且您会得到这些vtable错误。正如其他人所指出的,只需重新运行qmake。如果您使用的是Creator,它位于“构建”菜单下。

在源文件开发后期添加Q_对象宏时,通常会出现这种情况。Makefile还不认为您必须对文件进行moc,因此它不认为您必须对文件进行moc,并且您会得到这些vtable错误。正如其他人所指出的,只需重新运行qmake。如果您使用的是Creator,它位于“构建”菜单下。

问题可能与构造函数无关。构造函数必须将对象链接到vtable,仅此而已。问题很可能出现在其他代码中。我也看不出你的构造函数有问题。这个问题可能与构造函数无关。构造函数必须将对象链接到vtable,仅此而已。
问题很可能出现在其他代码中。我也看不出你的构造函数有什么问题。是的,很可能这就是问题啊,是的,两阶段编译的乐趣。。。关于QT.cmake和qmake,我唯一不喜欢的是它们都添加了规则来完成这两个阶段的编译。问题通常是当一个文件开始时不需要moc编译阶段,但后来在该文件已经添加到项目中并构建一次之后添加了Q_对象宏。是的,很可能就是这个问题啊,是的,两阶段编译的乐趣。。。关于QT.cmake和qmake,我唯一不喜欢的是它们都添加了规则来完成这两个阶段的编译。问题通常是当一个文件开始时不需要moc编译阶段,但后来在该文件已添加到项目并构建一次之后添加了Q_对象宏。谢谢,这非常有用。虽然,我真的不知道如何做到这一点,因为我目前的项目是一个CMake的。在.txt文件中,我在其他cpp文件列表中添加了fgui.cpp,但它似乎无法解决问题。如何在源文件上运行moc?再次,非常感谢。使用cmake,您似乎需要执行比运行cmake更多的步骤,但我无法向您解释这些。我建议您手动运行moc,看看是否可以通过这种方式解决问题。然后看看我发现的这一页:我希望这有帮助!也可以看看这个页面:谢谢,这很有用。虽然,我真的不知道如何做到这一点,因为我目前的项目是一个CMake的。在.txt文件中,我在其他cpp文件列表中添加了fgui.cpp,但它似乎无法解决问题。如何在源文件上运行moc?再次,非常感谢。使用cmake,您似乎需要执行比运行cmake更多的步骤,但我无法向您解释这些。我建议您手动运行moc,看看是否可以通过这种方式解决问题。然后看看我发现的这一页:我希望这有帮助!另请查看本页: