Неопределенная ссылка на vtable. Попытка скомпилировать проект Qt - PullRequest
49 голосов
/ 12 октября 2009

Я использую Code :: Blocks 8.02 и компилятор mingw 5.1.6. Я получаю эту ошибку при компиляции моего проекта Qt:

C: \ Документы и настройки \ Fuzz \ Desktop \ GUI \ App_interface.cpp | 33 | неопределенный ссылка на `vtable for AddressBook '

Файл 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"));
}

Ответы [ 16 ]

44 голосов
/ 14 июля 2010

При использовании Qt Creator:

  1. Build → Run qmake
  2. Build → Rebuild All
43 голосов
/ 12 октября 2009

Предупреждение: не делайте этого, если у вас уже есть файл .pro - вы его потеряете!

Чтобы автоматически убедиться, что все файлы moc cpp сгенерированы, вы можете заставить qmake автоматически сгенерировать для вас файл .pro вместо того, чтобы писать его самостоятельно.

Run

qmake -project

в каталоге проекта, и qmake просканирует ваш каталог на наличие всех заголовков C ++ и исходных файлов, чтобы сгенерировать файлы moc cpp для.

16 голосов
/ 12 октября 2009

Проблема почти наверняка в том, что вы не компилируете или не создаете ссылки в сгенерированном файле moc_AddressBook.cpp. (Он должен был быть сгенерирован для вас - вы запускаете Qt moc в своем коде перед компиляцией, верно?)

Чтобы ответить чуть более подробно, макрос Q_OBJECT сигнализирует инструмент Qt's moc, чтобы создать дополнительный файл реализации, содержащий код, необходимый для поддержки метаинформационной системы QObject. Если бы у вас были какие-либо сигналы или слоты, они бы тоже кое-что сделали.

Альтернативным решением может быть удаление макроса Q_OBJECT. Вы, вероятно, не хотите этого делать, но это помогло бы решить проблему, и это не является строго обязательным для представленного вами кода.

Также я бы отметил, что ваша строка:

#include "addressbook.h"

Вероятно, должно быть:

#include "AddressBook.h"

в зависимости от того, как вы представили имена файлов в вопросе.

9 голосов
/ 12 октября 2009

Предполагая, что вы используете qmake для генерации вашего Makefile, убедитесь, что AddressBook.h указан в переменной HEADERS вашего файла .pro, например,

HEADERS = AddressBook.h
4 голосов
/ 02 апреля 2011

Я получил это при использовании чисто виртуальных функций. Например, "виртуальный процесс void ();" дал эту ошибку, в то время как "виртуальный процесс void () = 0;" заставил это уйти. Для тех, кто ищет эту проблему, сначала проверьте это. Я использую Netbeans с компилятором MinGW.

2 голосов
/ 15 ноября 2017

Для проектов 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)
2 голосов
/ 29 марта 2011

удалил папку сборки, перезапустил Qt Creator и все заработало

2 голосов
/ 02 декабря 2009

У меня была такая же проблема, но как только я определил свой конструктор в файле заголовка вместо .cpp, ошибка исчезла. Также соответствующий файл moc отсутствовал в файловой системе и в разделе Makefile "compiler_moc_header_make_all". Я запустил qmake, и, наконец, все было построено с успехом. Я пошел, чтобы проверить Makefile, и он был там сейчас.

1 голос
/ 19 апреля 2015

В моем случае Rebuild All было недостаточно, мне пришлось удалить каталог сборки и сделать Rebuild All - тогда все заработало!

1 голос
/ 07 ноября 2011

Одна из причин - когда вы объявляете виртуальные функции в классе и не определяете их тело.

...