Почему возникают ошибки линковщика? Доброе время суток!
Читаю книгу "Программирование на языке С++
в среде 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
Очень много в выдаче по этой проблеме, но я не обладаю соответствующими знаниями, чтобы извлечь из этого что-то полезное.
Есть какие-нибудь мысли?=)

21 Авг 2019 в 07:05
240 +1
0
Ответы
1

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

После этого пересоберите проект и ошибка должна быть исправлена. Надеюсь, это поможет вам решить проблему!

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 90 161 автору
Первые отклики появятся уже в течение 10 минут
Прямой эфир