未定义的vtable参考。试图编译一个Qt项目

时间:2009-10-11 23:25:57

标签: c++ qt qmake

我正在使用Code::Blocks 8.02和mingw 5.1.6编译器。我在编译Qt项目时收到此错误:

  

C:\ Documents and Settings \ The   细毛\桌面\ GUI \ App_interface.cpp | 33 |未定义   引用“地址簿的vtable”

文件AddressBook.h:

 #ifndef ADDRESSBOOK_H
 #define ADDRESSBOOK_H

 #include <QWidget>

 class QLabel;
 class QLineEdit;
 class QTextEdit;

 class AddressBook : public QWidget
 {
     Q_OBJECT

 public:
     AddressBook(QWidget *parent = 0);

 private:
     QLineEdit *nameLine;
     QTextEdit *addressText;
 };

 #endif

文件AddressBook.cpp:

#include <QtGui>
#include "addressbook.h"

AddressBook::AddressBook(QWidget *parent)
     : QWidget(parent)
{
    QLabel *nameLabel = new QLabel(tr("Name:"));
    nameLine = new QLineEdit;

    QLabel *addressLabel = new QLabel(tr("Address:"));
    addressText = new QTextEdit;

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget(nameLabel, 0, 0);
    mainLayout->addWidget(nameLine, 0, 1);
    mainLayout->addWidget(addressLabel, 1, 0, Qt::AlignTop);
    mainLayout->addWidget(addressText, 1, 1);

    setLayout(mainLayout);
    setWindowTitle(tr("Simple Address Book"));
}

20 个答案:

答案 0 :(得分:44)

使用Qt Creator时:

  1. 构建→运行qmake
  2. 构建→重建所有

答案 1 :(得分:43)

警告:如果您已经有.pro文件,请不要这样做 - 您将丢失它!

为了自动确保生成所有moc cpp文件,您可以让qmake为您自动生成.pro文件,而不是自己编写.pro文件。

运行

qmake -project

在项目目录中,qmake将扫描你的目录中的所有C ++头文件和源文件,以生成moc cpp文件。

答案 2 :(得分:16)

问题几乎可以肯定是您没有在生成的moc_AddressBook.cpp文件中编译或不链接。 (它应该是为您生成的 - 您在编译之前在代码上运行Qt moc,对吗?)

为了更全面地回答,Q_OBJECT宏指示Qt的moc工具创建一个额外的实现文件,其中包含支持QObject元信息系统所需的代码。如果你有任何信号或插​​槽,那么它也可以做些事情。

另一种解决方案可能是删除Q_OBJECT宏。您可能不希望这样做,但它可以帮助解决当前的问题,并且对于您提供的代码并不是绝对必要的。

另外,我会注意到你的行:

#include "addressbook.h"

应该是:

#include "AddressBook.h"

根据您在问题中显示文件名的方式。

答案 3 :(得分:9)

假设您正在使用qmake生成Makefile,请确保在.pro文件的HEADERS变量中指定了AddressBook.h,例如

HEADERS = AddressBook.h

答案 4 :(得分:4)

我在使用纯虚函数时得到了这个。例如, “虚拟空隙过程();” 给出了这个错误,而 “virtual void process()= 0;” 让它消失了。 对于谷歌搜索此问题的任何人,请先检查一下。 我正在使用Netbeans和MinGW编译器。

答案 5 :(得分:2)

我遇到了同样的问题,但是一旦我在头文件中定义了构造函数而不是.cpp,错误就消失了。此外,文件系统和Makefile部分“compiler_moc_header_make_all”中缺少相应的moc文件。我跑了一个qmake,然后最后一切都是成功的。我去检查Makefile,它现在就在那里。

答案 6 :(得分:2)

删除了构建文件夹,重新启动了Qt Creator并且工作正常

答案 7 :(得分:2)

对于CMake项目,将CMAKE_AUTOMOC设置为ON,这解决了我的问题。

#Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)

答案 8 :(得分:1)

我遇到同样的问题,重建项目永远不会更新Makefile,我删除了Makefile并重建,问题就消失了。 ps:从命令行运行'make'可能会提供比IDE更详细的信息,并且有助于解决实际问题。

答案 9 :(得分:1)

一个原因是当你在一个类中声明虚函数而你没有定义它们的主体时。

答案 10 :(得分:1)

在我的案例中Rebuild All还不够,我不得不删除构建目录并使Rebuild All - 然后它才有效!

答案 11 :(得分:0)

CMake

当使用 CMake 时,有趣的是,如果我的 .cpp 和 .h 文件不在同一个文件夹中,默认情况下 moc 将无法生成元文件 :)

答案 12 :(得分:0)

我在使用CLion时遇到了同样的问题,并通过将这些行添加到CMakeLists.txt来解决了该问题

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

请参见https://www.jetbrains.com/help/clion/qt-tutorial.html#qt-setup-in-clion

答案 13 :(得分:0)

只需清除项目然后重新构建即可!

答案 14 :(得分:0)

用于moc编译的头文件应包含在HEADERS + = ...变量中

我已将Myproject.pro中的头文件移至SOURCES + = ...部分,因为我想将mySource.h和mySource.cpp放在同一树元素中。但这对QT Creator来说是错误的。结果发生错误“未定义对vtable的引用”。 好像是: QT仅在HEADERS + = ...部分(或变量)中检测moc编译的头。 另请参见other stackoverflow answer第二答案中的正确解释:“我已经看到很多解决问题的方法,但是没有解释为什么会发生,所以去吧。”在我看来,这是对问题的准确解释,这有助于我发现并解决我的问题。

答案 15 :(得分:0)

只需Run qmake即可完成您的项目。右键单击项目名称,然后单击Run qmake,即可轻松完成此操作。

答案 16 :(得分:0)

如果您不小心添加了析构函数原型,您将收到相同的错误消息。添加一个空的析构函数定义或删除原型。

答案 17 :(得分:0)

我在尝试使用受保护的虚拟功能时遇到了同样的问题。有两件事情有效。

  1. void process();更改为void process() = 0;
  2. process()公开而不是私有

答案 18 :(得分:0)

转到.pro文件,确保.h文件前面有'include'。 HEADERS + = include / file.h \            包括/ file2.h

答案 19 :(得分:-1)

我正在使用Qt创建器来编译和运行我的程序,我不经常使用 Qt命令提示符。我做了一件事来摆脱烦人的错误&#34; vtable某事&#34;是通过将以下行添加到.pro文件。

  

TEMPLATE = app

     

QT + =核心

相关问题