Почему возникают ошибки линковщика? Доброе время суток!
Читаю книгу "Программирование на языке С++
в среде 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
286 +1
1
Ответы
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 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир