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

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

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

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

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

...