55

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

C:\Documents and Settings\The Fuzz\Desktop\GUI\App_interface.cpp|33|undefined reference to `vtable for 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

文件地址簿.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"));
}
4

20 回答 20

51

使用 Qt Creator 时:

  1. 构建 → 运行 qmake
  2. 构建 → 全部重建
于 2010-07-14T17:21:50.787 回答
47

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

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

qmake -project

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

于 2009-10-12T04:51:10.400 回答
16

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

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

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

另外,我会注意到您的线路:

#include "addressbook.h"

应该是:

#include "AddressBook.h"

根据您在问题中呈现文件名的方式。

于 2009-10-12T00:53:17.850 回答
10

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

HEADERS = AddressBook.h
于 2009-10-12T02:18:19.673 回答
5

对于 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)
于 2017-11-15T13:28:50.873 回答
4

我在使用纯虚函数时得到了这个。例如,

virtual void process();

给出了这个错误,而

virtual void process() = 0;

让它消失了。

对于正在谷歌搜索此问题的任何人,请检查是否定义了所有虚拟函数。(通过“= 0”或源文件中的完整定义)我将 Netbeans 与 MinGW 编译器一起使用。

于 2011-04-02T05:14:41.057 回答
3

我在使用 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

于 2020-09-15T00:34:23.830 回答
2

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

于 2009-12-02T19:54:14.237 回答
2

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

于 2011-03-29T12:51:29.853 回答
1

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

于 2010-02-26T02:55:13.067 回答
1

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

于 2011-11-07T13:03:39.650 回答
1

在我的情况下,Rebuild All 是不够的,我必须删除构建目录并进行 Rebuild All - 然后它起作用了!

于 2015-04-19T20:58:38.367 回答
1

Run qmake为您的项目。这可以通过右键单击项目名称并单击 来轻松完成Run qmake

于 2019-01-08T05:18:34.650 回答
1

只需清除项目,然后重建它!

于 2020-03-30T19:51:57.953 回答
0

转到 .pro 文件并确保 .h 文件前面有“包含”。标题 += 包含/file.h \ 包含/file2.h

于 2010-08-10T18:22:17.867 回答
0

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

  1. 更改void process();void process() = 0;
  2. 公开process()而不是私有
于 2014-10-06T21:34:12.587 回答
0

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

于 2017-11-08T09:29:16.327 回答
0

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

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

于 2019-08-15T08:58:59.787 回答
0

制作

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

于 2021-03-03T13:10:10.283 回答
-1

我正在使用 Qt creator 来编译和运行我的程序,我不经常使用Qt 命令提示符。我为摆脱烦人的错误“ vtable something something ”所做的一件事是通过将以下行添加到.pro文件中。

模板 = 应用程序

QT += 核心

于 2014-09-19T03:54:40.417 回答