未定义的引用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时:
- build立→运行qmake
- 生成→重build所有
问题几乎可以肯定的是,你没有编译或不链接在生成的moc_AddressBook.cpp文件。 (它应该是为你生成的 – 在编译之前你正在运行Qt的moc
代码,对吗?)
为了更全面地回答, Q_OBJECT
macros指示Qt的moc
工具创build一个额外的实现文件,其中包含支持QObject
元信息系统所需的代码。 如果你有任何信号或插槽,它也会做一些事情。
另一种解决scheme可能是删除Q_OBJECT
macros。 你可能不想这样做,但它会帮助你解决眼前的问题,而且你所提供的代码并不是绝对必要的。
另外,我会注意到你的行:
#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。 两件事情奏效。
- 改变
void process();
void process() = 0;
- 使
process()
公开而不是私有
如果不小心添加了析构函数原型,您将得到相同的错误信息。 添加一个空的析构函数定义或删除原型。
对于CMake项目,将CMAKE_AUTOMOC设置为ON,这解决了我的问题。
#Find包含在相应的编译目录中(CMAKE_INCLUDE_CURRENT_DIR ON)
#指示CMake在需要时自动运行moc。 设置(CMAKE_AUTOMOC ON)
我正在使用Qt创build器来编译和运行我的程序,我不经常使用Qt命令提示符 。 有一件事我摆脱了恼人的错误“ vtable东西 ”是通过添加以下行到.pro
文件。
TEMPLATE = app
QT + =核心