未定义的引用vtable。 试图编译一个Qt项目

我使用的是Code :: Blocks 8.02和mingw 5.1.6编译器。 编译我的Qt项目时出现这个错误:

C:\ Documents and Settings \ The Fuzz \ Desktop \ GUI \ App_interface.cpp | 33 |对AddressBook的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")); } 

警告:如果你已经有一个.pro文件,不要这样做 – 你会失去它!

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

 qmake -project 

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

使用Qt Creator时:

  1. build立→运行qmake
  2. 生成→重build所有

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

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

另一种解决scheme可能是删除Q_OBJECTmacros。 你可能不想这样做,但它会帮助你解决眼前的问题,而且你所提供的代码并不是绝对必要的。

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

 #include "addressbook.h" 

应该可能是:

 #include "AddressBook.h" 

根据你如何在问题中呈现文件名。

假设你正在使用qmake来生成你的Makefile,请确保AddressBook.h是在.pro文件的HEADERSvariables中指定的,例如

 HEADERS = AddressBook.h 

我在使用纯虚函数的时候得到了这个。 例如,“virtual void process();” 给出了这个错误,而“virtual void process()= 0;” 使它消失。 对于任何人用Googlesearch这个问题,首先检查。 我使用MinGW编译器使用Netbeans。

删除生成文件夹,重新启动Qt Creator,它的工作

我有同样的问题,但只要我在头文件中定义我的构造函数,而不是.cpp错误消失。 在文件系统和Makefile部分“compiler_moc_header_make_all”中缺less相应的moc文件。 我跑了一个qmake,最后所有的一切都build成了。 我去检查Makefile,它现在在那里。

我来同样的问题,重build项目永远不会更新的Makefile,我删除的Makefile和重build,问题不复存在。 ps:从命令行运行“make”可能会给你比IDE详细的信息,并有助于得到真正的问题。

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

在我的情况下,重build所有是不够的,我不得不删除生成目录,使重build全部 – 然后它的工作!

转到.pro文件并确保.h文件具有“包含”之前。 HEADERS + = include / file.h \ include / file2.h

我有同样的问题,试图使用一个受保护的虚拟function。 两件事情奏效。

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

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

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

#Find包含在相应的编译目录中(CMAKE_INCLUDE_CURRENT_DIR ON)

#指示CMake在需要时自动运行moc。 设置(CMAKE_AUTOMOC ON)

我正在使用Qt创build器来编译和运行我的程序,我不经常使用Qt命令提示符 。 有一件事我摆脱了恼人的错误“ vtable东西 ”是通过添加以下行到.pro文件。

TEMPLATE = app

QT + =核心