Ошибка компоновщика Q_OBJECT!

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

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

HIMyClass.obj:: error: неразрешенный внешний символ "общественности: виртуальный void * __thiscall CHIMyClass:: qt_metacast (charconst *)" (? qt_metacast @CHIMyClass @@UAEPAXPBD @Z) Файл не найден: HIMyClass.obj

HIMyClass.obj:: error: неразрешенный внешний символ "общественности: виртуальный 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 как компилятор.

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

Ответ 1

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

Ответ 2

У меня была аналогичная проблема, и она была решена с использованием обратной связи andref. Внутри QT Creator я просто:

  • Сборка/Очистка всех
  • Сборка/Запуск qmake
  • Build/Run

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

Убедитесь, что необходимые параметры конфигурации Qt присутствуют в файле pro (QT += core gui по крайней мере. Также попробуйте вручную удалить все, что было создано/создано в каталоге сборки. Иногда бывает, что moc не запускается по какой-либо причине.

Вы также можете попробовать запустить команду moc самостоятельно и посмотреть, что она выводит (вы можете найти командную строку на вкладке "Скомпилировать вывод" в QtCreator.

UPDATE: эта проблема, похоже, предполагает, что вы не определяете QT_DLL при компиляции. Можете ли вы попробовать свежий и новый простой проект QtCreator (например, с виджетами, например, подклассы mainwindow) и попробуйте это. Он должен содержать заголовок Q_OBJECT автоматически и попытаться сравнить файлы .pro и выход компилятора.

Ответ 7

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

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

"vtable для MainWindow", на который ссылается:

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

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

Ответ 11

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

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