Ошибка компоновщика 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).