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

The*_*uzz 51 c++ qt qmake

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

C:\ Documents and Settings\Fuzz\Desktop\GUI\App_interface.cpp | 33 |未定义引用`vtable for AddressBook'

文件地址Book.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
Run Code Online (Sandbox Code Playgroud)

文件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"));
}
Run Code Online (Sandbox Code Playgroud)

小智 48

使用Qt Creator时:

  1. 构建→运行qmake
  2. 构建→全部重建

  • 这个答案有误导性.如果OP使用Qt Creator则完全有意义,但OP仅表示Code :: Blocks.据我所知,Code :: Blocks在构建菜单上没有带*run qmake*选项,为什么会这样?我相信一个插件会添加这样的选项,但OP没有提到使用任何第三方插件.OP可能仍然必须运行qmake,但告诉他们使用可能不存在的菜单选项并不会有帮助. (2认同)

blw*_*y10 44

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

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

qmake -project
Run Code Online (Sandbox Code Playgroud)

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

  • ***不要运行这个***.这将消除您的`.pro`文件及其中的任何修改.单独运行`qmake`(从命令行或从Creator中的Build菜单)就足够了. (4认同)
  • 我有与OP完全相同的问题,但在我的情况下重新运行qmake并没有解决它.这只是部分解决方案,仅适用于某些人. (3认同)
  • **这个答案是错误和危险的.就这样.除非你从头开始并且没有现有的.pro文件,否则你永远不必这样做!** (2认同)

Cal*_*itt 16

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

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

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

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

#include "addressbook.h"
Run Code Online (Sandbox Code Playgroud)

应该是:

#include "AddressBook.h"
Run Code Online (Sandbox Code Playgroud)

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

  • 即使在Windows上你仍然应该注意案例...在Unix上检查一个项目并且必须手动修复这样的案例问题真的很烦人,因为Windows上的原始开发人员并不关心 (11认同)

Jer*_*ner 9

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

HEADERS = AddressBook.h
Run Code Online (Sandbox Code Playgroud)


Dum*_*ene 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)
Run Code Online (Sandbox Code Playgroud)