2010-07-16 3 views
11

Я получаю следующую ошибку компоновщика при создании моего приложения.Ошибка компоновщика Q_OBJECT!

HIMyClass.obj:: error: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall CHIMyClass::metaObject(void)const " ([email protected]@@[email protected]@XZ) File not found : HIMyClass.obj

HIMyClass.obj:: error: unresolved external symbol "public: virtual void * __thiscall CHIMyClass::qt_metacast(char const *)" ([email protected]@@[email protected]) File not found : HIMyClass.obj

HIMyClass.obj:: error: unresolved external symbol "public: virtual int __thiscall CHIMyClass::qt_metacall(enum QMetaObject::Call,int,void * *)" ([email protected]@@[email protected]@@[email protected]) File not found : HIMyClass.obj

Мой класс декларации как

class CHIMyClass:public QDialog 
{ 
    Q_OBJECT 

    .... 

}; 

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

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

+0

Возможно 'Файл не найден: HIMyClass.obj' сообщите нам, что Qt Creator не видит файлы moc/obj/temp? – mosg

+1

Действительно, повторите qmake. Кроме того, проверьте отсутствие или дополнительные символы «\» в вашем файле .pro. – andref

ответ

27

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

+0

Соответствующий заголовочный файл доступен уже под переменной HEADERS, которая все еще сталкивается с проблемой. Это не причина .. по крайней мере, в моем случае .. :( – liaK

+2

Удалите вручную все файлы, созданные qmake и всеми объектными файлами, затем перезапустите qmake. – chalup

+1

@ chalup, я удалил все файлы MOC, OBJ, RCC и запустил qmake, теперь он работает нормально. Хотя я рад, что это сработало, это безумие .. Почему такое неопределенное поведение? Любая догадка – liaK

0

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

вы также можете попробовать запустить МОЦ команду самостоятельно, и посмотреть, что он выводит (вы можете найти командную строку на вкладке «Compile выход» в QtCreator

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

+0

Это не символы Qt, которые отсутствуют, но символы, генерируемые moc для своего класса. Поэтому я предпочел бы пойти с chalup и проверить, чтобы заголовок был указан в HEADERS. может также помочь полностью чистая сборка. –

+0

Он связывает все остальные классы с макросом [email protected], я включил файл в раздел HEADERS и пробовал чистые сборки более одного раза .. Не повезло, хотя .. :( – liaK

1

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

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

12

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

  1. Сложение/Промывайте все
  2. Сложение/Run QMAKE
  3. Build/Run
+0

Это исправлено для меня – ThePosey

+0

qmake - ключевое примечание;) –

1

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

0

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

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

"vtable for MainWindow", referenced from:

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

С момента написания этого поста, я пересмотрел

я обнаружил, что мне нужно коснуться файла .pro Перед началом восстановления, т.е.

  1. Добавить случайные символы
  2. Сохранить
  3. Удаление случайных символов
  4. Сохранить
  5. Build Project

шаги 1 - 4, кажется недействительными все старые MOC * файлы, заставляющие qmake восстановить их. В противном случае проект перестроения, по-видимому, использует устаревшие файлы moc *.

[EDIT] Обновленный ответ.

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

0

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

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

0

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

0

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

0

Ответы @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).

Смежные вопросы