Undefined ссылка на vtable. Попытка скомпилировать проект Qt

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

C:\Documents and Settings \ Fuzz\Desktop\GUI\App_interface.cpp | 33 | undefinedссылка на `vtable для 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"));
}

Ответ 1

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

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

Run

qmake -project

в каталоге проекта, и qmake сканирует ваш каталог для всех заголовков С++ и исходных файлов для генерации файлов mc cpp для.

Ответ 2

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

  • Построение → Запуск qmake
  • Построить → Восстановить все

Ответ 3

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

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

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

Кроме того, я хотел бы отметить, что ваша строка:

#include "addressbook.h"

Должно быть:

#include "addressbook.h"

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

Ответ 4

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

HEADERS = AddressBook.h

Ответ 5

Я получил это при использовании чисто виртуальных функций. Например,

virtual void process();

дал эту ошибку, в то время как

virtual void process() = 0;

заставил это уйти.

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

Ответ 6

Для проектов 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)

Ответ 7

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

Ответ 8

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

Ответ 9

Я прихожу к той же проблеме, перестраиваю проект, никогда не обновляю Makefile, я удаляю Makefile и перестраиваю, проблема ушла. ps: run 'make' из командной строки может предоставить вам подробную информацию, чем IDE, и полезен для получения реальной проблемы.

Ответ 10

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

Ответ 11

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

Ответ 12

Перейдите в .pro файл и убедитесь, что файл .h имеет перед ним "include". HEADERS + = include/file.h \          включают в себя/file2.h

Ответ 13

У меня была такая же проблема с попыткой использовать защищенную виртуальную функцию. Две вещи работали.

  • Изменение void process(); на void process() = 0;
  • Создание process() public вместо частного

Ответ 14

Вы получите то же сообщение об ошибке, если случайно добавите прототип деструктора. Добавьте пустое определение деструктора или удалите прототип.

Ответ 15

Просто Run qmake для вашего проекта. Это легко сделать, щелкнув правой кнопкой мыши по названию вашего проекта и выбрав Run qmake.

Ответ 16

Заголовочные файлы для компиляции moc должны содержаться в переменной HEADERS + =...:

Я переместил файлы заголовков в Myproject.pro в раздел SOURCES + =..., потому что я хочу, чтобы mySource.h и mySource.cpp были в одном элементе дерева. Но это ошибочно для QT Creator. В результате произошла ошибка "Неопределенная ссылка на vtable". Это кажется: QT обнаруживает заголовок для компиляции moc только в разделе HEADERS + =... (или переменной). См. также правильное объяснение в fooobar.com/questions/105550/... Второй ответ: "Я видел много способов решения проблемы, но нет объяснения, почему это происходит, поэтому здесь идет речь". На мой взгляд, это точное объяснение проблемы, которая помогла мне найти и решить мою проблему.

Ответ 17

Я использую создателя Qt для компиляции и запуска моих программ, я часто не использую командную строку Qt. Одна вещь, которую я сделал, чтобы избавиться от раздражающей ошибки " vtable что-то что-то", добавив следующие строки в файл .pro.

TEMPLATE = приложение

QT + = core