Qt ошибка сборки в консольном приложении (Visual Studio)
Скачал и установил Qt, создал проект консольного приложения Qt в Visual Studio. Написал свой класс с 1 сигналом. Всё запускается нормально, но стоит создать объект класса, то вылетает ошибка:
1>main.obj : error LNK2001: неразрешенный внешний символ "public: virtual struct QMetaObject const * __cdecl MyClass1::metaObject(void)const " (?metaObject@MyClass1@@UEBAPEBUQMetaObject@@XZ).
1>main.obj : error LNK2001: неразрешенный внешний символ "public: virtual void * __cdecl MyClass1::qt_metacast(char const *)" (?qt_metacast@MyClass1@@UEAAPEAXPEBD@Z).
1>main.obj : error LNK2001: неразрешенный внешний символ "public: virtual int __cdecl MyClass1::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MyClass1@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z).
1>C:\Users\Max\source\repos\QtConsoleApplication1\x64\Debug\QtConsoleApplication1.exe : fatal error LNK1120: неразрешенных внешних элементов: 3
Вот код:
#include <QtCore>
class MyClass1 : public QObject {
Q_OBJECT
public:
MyClass1() : QObject(), inf("Inf from the class MyClass1") {}
void sendSignal() {
emit Test(inf);
}
private:
QString inf;
signals:
void Test(const QString&);
};
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
MyClass1 obj1;
return a.exec();
}
Ответы (1 шт):
Это классическая особенность Qt. Если в cpp файле объявлен класс с макросом Q_OBJECT, то вот так и будет. Лечение - перенести объявление класса в h файл. Либо добавить вот такую строку в файл #include "main.moc" (имя совпадает с именем cpp файла, это важно!). И убедится, что moc обрабатывает этот файл. В Qt Creator это обычно автоматом происходит, в студии может быть по другому.
Если используется cmake (ну мало чего), можно посмотреть ещё один мой ответ - Ошибка “неразрешенный внешний символ..” при наследовании от Q_Object