Почему возникают ошибки линковщика? Доброе время суток! Читаю книгу "Программирование на языке С++ в среде Qt Creator" от Е. Р. Алексеев, Г. Г. Злобин, Д. А.Костюк, О. В.Чеснокова, А. С.Чмыхало Столкнулся с такой проблемой: Содержимое файла *.pro:TEMPLATE = app TARGET = ParentExample QT += widgets HEADERS += \ parentwidget.h SOURCES += \ main.cpp \ parentwidget.cpp Содержимое файла parentwidget.cpp:#include "parentwidget.h" #include #include ParentWidget::ParentWidget(QWidget* parent):QWidget(parent) { //используем указатели, чтобы дочерние элементы не удалились после завершения работы конструктора QLabel* ILabel = new QLabel(this); //this - это экземпляр класс ParentWidget, указывается родительский виджет (*ILabel).setGeometry(50,0,100,30); (*ILabel).setText("Привет, товарищ!"); QPushButton* lPushButton = new QPushButton(this); (*lPushButton).setGeometry(50,50,100,30); (*lPushButton).setText("Жми!"); setGeometry(x(),y(),300,150); setWindowTitle("Наследник Образец"); } Содержимое файла parentwidget.h:#ifndef PARENTWIDGET_H #define PARENTWIDGET_H #include class ParentWidget : public QWidget { Q_OBJECT public: explicit ParentWidget(QWidget *parent = 0); signals: public slots: }; #endif // PARENTWIDGET_H В итоге при попытке собрать и запустить проект у меня появляются ошибки такого рода:parentwidget.obj:-1: ошибка: LNK2001: неразрешенный внешний символ ""public: virtual struct QMetaObject const * __cdecl ParentWidget::metaObject(void)const " (?metaObject@ParentWidget@@UEBAPEBUQMetaObject@@XZ)"parentwidget.obj:-1: ошибка: LNK2001: неразрешенный внешний символ ""public: virtual void * __cdecl ParentWidget::qt_metacast(char const *)" (?qt_metacast@ParentWidget@@UEAAPEAXPEBD@Z)"parentwidget.obj:-1: ошибка: LNK2001: неразрешенный внешний символ ""public: virtual int __cdecl ParentWidget::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@ParentWidget@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)"debug\widgets.exe:-1: ошибка: LNK1120: неразрешенных внешних элементов: 3 Очень много в выдаче по этой проблеме, но я не обладаю соответствующими знаниями, чтобы извлечь из этого что-то полезное. Есть какие-нибудь мысли?=)
Ошибка линковщика LNK2001 возникает, когда компилятор не может найти определение для функций или методов, которые были объявлены в коде. В вашем случае, это связано с метаобъектной системой Qt и нехваткой метаинформации для класса ParentWidget.
Для решения проблемы, вам нужно добавить макрос Q_OBJECT внутри определения класса ParentWidget в файле parentwidget.h. Этот макрос используется для генерации метаинформации о классе, необходимой для работы с сигналами и слотами в Qt.
Вот как должен выглядеть файл parentwidget.h после добавления макроса Q_OBJECT:
ifndef PARENTWIDGET_Hdefine PARENTWIDGET_Hinclude
class ParentWidget : public QWidget { Q_OBJECT public: explicit ParentWidget(QWidget *parent = nullptr);
signals:
public slots: };
endif // PARENTWIDGET_H
После этого пересоберите проект и ошибка должна быть исправлена. Надеюсь, это поможет вам решить проблему!
Ошибка линковщика LNK2001 возникает, когда компилятор не может найти определение для функций или методов, которые были объявлены в коде. В вашем случае, это связано с метаобъектной системой Qt и нехваткой метаинформации для класса ParentWidget.
Для решения проблемы, вам нужно добавить макрос Q_OBJECT внутри определения класса ParentWidget в файле parentwidget.h. Этот макрос используется для генерации метаинформации о классе, необходимой для работы с сигналами и слотами в Qt.
Вот как должен выглядеть файл parentwidget.h после добавления макроса Q_OBJECT:
ifndef PARENTWIDGET_Hdefine PARENTWIDGET_Hincludeclass ParentWidget : public QWidget
{
Q_OBJECT
public:
explicit ParentWidget(QWidget *parent = nullptr);
signals:
public slots:
endif // PARENTWIDGET_H};
После этого пересоберите проект и ошибка должна быть исправлена. Надеюсь, это поможет вам решить проблему!