Неразрешенный внешний символ «public: virtual struct QMetaObject const * __thiscall Parent»

Я унаследовал класс от QObject:

class Parent: public QObject
{
Q_OBJECT
QObject* cl;

public:
Parent(QObject *parent=0):QObject(parent) {
cl = NULL;
}

QObject* getCl() const {
return cl;
}
void setCl(QObject *obj) {
cl = obj;
}
};

Но когда я пишу:

Parent ev;

Я получаю следующую ошибку:

main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Parent::metaObject(void)const " (?metaObject@Parent@@UBEPBUQMetaObject@@XZ)

main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual void * __thiscall Parent::qt_metacast(char const *)" (?qt_metacast@Parent@@UAEPAXPBD@Z)

main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual int __thiscall Parent::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Parent@@UAEHW4Call@QMetaObject@@HPAPAX@Z)

58

Решение

Вы должны удалить debug папку вашего приложения и запустите его снова, чтобы исправить эту проблему.

64

Другие решения

Если вы используете Visual Studio, удалите строку Q_OBJECT из заголовочного файла, сохраните файл, положите Q_OBJECT обратно в заголовочный файл, сохраните файл еще раз. Это должно генерировать moc_* файл и должен построить и связать правильно.

52

Я заметил, что некоторые ответы основаны на Visual Studio.

Этот ответ основан на Qt Creator.

В отличие от названия предполагают, Rebuild Project не буду все уничтожать и строить с нуля. Если вы недавно добавили QObject (и / или Q_OBJECT) для вашего класса, вам придется запустить qmake опять, например

  1. Чистый Проект
  2. Запустите qmake
  3. Построить проект

Это потому, что по умолчанию qmake запускается только тогда, когда вы вносите значительные изменения в свое решение, например добавляете новые исходные файлы или изменяете .pro файл. Если вы вносите изменения в существующий файл, он не знает, что нужно запустить qmake,

В качестве отступления, чтобы заставить Qt собрать все с нуля, удалите Debug или же Release папка.

26

Поэтому проблема была в том, что мне нужен компилятор Qt MOC для компиляции моего файла .h. Это необходимо для любых классов, расширяющих QObject или одного из его дочерних классов. Исправление вызвало (для меня) щелчок правой кнопкой мыши по файлу заголовка, выбрав «Свойства» и установив «Тип элемента» «Вход Qt MOC», затем нажав «Компилировать» в заголовке, а затем добавив полученный файл moc_myfilename.cpp в мой файл. проект.

8

Если ваши файлы moc сгенерированы в проекте Visual Studio, попробуйте включить их в проект, если они не включены в проект, а затем пересоберите.

7

У меня была та же проблема в Visual Studio, и я решил ее, выполнив следующие шаги:

  1. Щелкните правой кнопкой мыши заголовочный файл в обозревателе решений.
  2. свойства
  3. Измените «Тип элемента» на «Custom Build Tool»

Затем в конфигурации Custom Build Tool:

  1. Перейти к генералу
  2. установите «Командную строку» на:

    «$ (QTDIR) \ bin \ moc.exe» «% (FullPath)» -o «. \ GeneratedFiles \ $ (ConfigurationName) \ moc _% (имя файла) .cpp» «-fStdAfx.h» «-f ../ ../../src/FileName.h«-DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DWIN32_LEAN_AND_MEAN -DDIS_VERSION = 7 -D_MATH_DEFINES_DEFINED «-I \ SFML_STATIC» «-I \ GeneratedFiles.» «-I»».. — I $ (QTDIR) \ include «» -I. \ GeneratedFiles \ $ (ConfigurationName). «» -I $ (QTDIR) \ include \ QtCore «» -I $ (QTDIR) \ include \ QtGui «» -I $ ( QTDIR) \ включают \ QtNetwork»

  3. установите «Выходы» на:

    .\ GeneratedFiles \ $ (ConfigurationName) \ MOC _% (Имя файла) .cpp

  4. установите «Дополнительные зависимости» на:
    $ (QTDIR) \ Bin \ moc.exe;% (FullPath)


Ваши точные значения могут отличаться. Они обычно применяются через плагин Qt.

6

Я использую CMake для управления проектами Qt, и новый вызов Q_OBJECT необходимо добавить в вызов QT4_WRAP_CPP. Это сгенерирует moc _ *. Cxx для включения в проект и очистит неразрешенные внешние компоненты.

4

У меня была эта проблема с Visual Studio 2012, когда в моем файле cpp было определение класса Q_OBJECT. Перемещение определения класса в заголовочный файл решило проблему.

Похоже, что должна быть возможность поддерживать класс Q_OBJECT в файле cpp, добавив файл cpp в moc, но я этого не пробовал.

3
По вопросам рекламы [email protected]