Ошибка компоновщика Q_OBJECT! - PullRequest
12 голосов
/ 16 июля 2010

При создании приложения я получаю следующую ошибку компоновщика.

HIMyClass.obj :: ошибка: Неразрешенный внешний символ "Общественность: виртуальная структура QMetaObject const * __thiscall CHIMyClass :: metaObject (void) const " (? Метаобъект @ CHIMyClass @@ UBEPBUQMetaObject @@ XZ) Файл не найден: HIMyClass.obj

HIMyClass.obj :: ошибка: Неразрешенный внешний символ "Общественность: виртуальная пустота * __thiscall CHIMyClass :: qt_metacast (голец const *) " (? qt_metacast @ CHIMyClass @@ UAEPAXPBD @ Z) Файл не найден: HIMyClass.obj

HIMyClass.obj :: ошибка: Неразрешенный внешний символ "Общественность: виртуальный int __thiscall CHIMyClass :: qt_metacall (перечисление QMetaObject :: Call, int, void * *) " (? qt_metacall @ CHIMyClass @@ UAEHW4Call @ QMetaObject @@ HPAPAX @ Z) Файл не найден: HIMyClass.obj

Объявление моего класса похоже на

class CHIMyClass:public QDialog
{
   Q_OBJECT

   ....

};

Когда я комментирую Q_OBJECT, ошибка компоновщика исчезает ( и, очевидно, я не могу использовать сигналы и слоты ). Я использую Qt Creator в качестве IDE и Qt 4.5.3. Когда я даю Rebuild All , определенно будет вызван QMake . Я думаю, что проблема заключается в генерации файлов moc_ *. Я использую Windows XP и cl в качестве компилятора.

В чем может быть причина этой ошибки компоновщика?

Ответы [ 11 ]

28 голосов
/ 16 июля 2010

Такие ошибки обычно означают, что вы не добавили заголовок вашего класса в переменную "HEADERS" в файле pro (мета-объектный компилятор генерирует файлы moc_ только для заголовков, перечисленных в этой переменной).Не забудьте запустить qmake после изменения .pro-файла!

12 голосов
/ 11 февраля 2011

У меня была похожая проблема, и она была решена с помощью обратной связи от andref.В QT Creator я просто:

  1. Построить / очистить все
  2. Построить / запустить qmake
  3. Построить / запустить
2 голосов
/ 03 июля 2013

Каждый раз, когда вы меняете наследование QObject, обязательно наберите clean, qmake, а затем build.Значение qmake важно, поскольку оно обновляет файлы moc * для любых новых изменений Qt в ваших файлах .h, включая наследование QObject, то есть Q_OBJECT.На самом деле, в некоторых случаях вы можете просто сделать qmake, а затем build для инкрементной сборки.

1 голос
/ 23 мая 2012

У меня была такая же проблема, но в моем случае ее было недостаточно для очистки -> сборки.Поэтому мне пришлось вручную удалить все файлы, созданные в процессе сборки (Mekefiles, ui descriptionns в cpp и вообще весь каталог, созданный в процессе сборки), и только после этого сборка прошла успешно.

1 голос
/ 19 августа 2010

Проверьте в файле MakeFile.debug и, возможно, HIMyClass не существует.

Я просто переименую MakeFile.debug, Очистите проект и перестройте все, и он скомпилируется.

0 голосов
/ 16 июня 2016

Ответы от @chalup и @ierax помогли мне. Мне пришлось закрыть создатель Qt и открыть его снова, хотя qmake вступил в силу. Я следовал за этими шагами: 1. Переместил определение класса в заголовочный файл. 2. Добавил заголовочный файл в проект и убедился, что он указан в списке HEADERS + = \ list в файле .pro. 3. Чисто-все 4. закройте QtCreator (в Windows 10) 5. Удалите Makefiles из каталога проекта 6. Откройте QtCreator и откройте проект. 7. Qmake для обеспечения генерации make-файлов. 8. Восстановить все

Эти шаги помогли мне решить эту проблему - я больше часа боролся с различными другими ответами и методами, но ничего не получалось. Перед запуском qmake убедитесь, что вы удалили make-файлы и закрыли QtCreator (применимо по крайней мере в Windows 10).

0 голосов
/ 12 марта 2016

Я удалил #include "main.moc" из основного файла и забыл добавить его заново ... Это было забавно!

0 голосов
/ 04 августа 2014

У меня была эта проблема.Проверьте, есть ли описание реализации слота в файле .cpp.

0 голосов
/ 05 июня 2014

Я нашел другую возможную причину и решение этой ошибки

Эта ошибка также произойдет, если один объявил слот в файле .h, но не определил его тело в реализации

0 голосов
/ 26 августа 2012

на моем osx box это было связано с отсутствием файлов moc *. я исправил это, удалив бомбу из моего .pro-файла в кодировке utf-8. я сообщу об ошибке с qt.

ошибка для поиска очков ... ПРИМЕЧАНИЕ. Отсутствующий vtable обычно означает, что первая не встроенная виртуальная функция-член не имеет определения.

"vtable for MainWindow", на который ссылаются из:

 MainWindow::MainWindow(QWidget*)in mainwindow.o
...