我正在使用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"));
}
答案 0 :(得分:44)
使用Qt Creator时:
答案 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)
我在尝试使用受保护的虚拟功能时遇到了同样的问题。有两件事情有效。
void process();
更改为void process() = 0;
process()
公开而不是私有答案 18 :(得分:0)
转到.pro文件,确保.h文件前面有'include'。 HEADERS + = include / file.h \ 包括/ file2.h
答案 19 :(得分:-1)
我正在使用Qt创建器来编译和运行我的程序,我不经常使用 Qt命令提示符。我做了一件事来摆脱烦人的错误&#34; vtable某事&#34;是通过将以下行添加到.pro
文件。
TEMPLATE = app
QT + =核心