c++ - 突然出现LNK2005和LNK1169错误

标签 c++ qt linker-errors

请在标记为已回答之前仔细阅读此内容,因为其他解决方案都对我没有帮助。

所以当我在调试或发布中编译我的程序时,我遇到了 2 个错误:

moc_guiitemlistrepeat.obj:-1: error: LNK2005: "public: void __cdecl GUIItemListRepeat::isUpdated(void)" (?isUpdated@GUIItemListRepeat@@QEAAXXZ) already defined in guiitemlistrepeat.obj

enter image description here

release\Calendar.exe:-1: error: LNK1169: one or more multiply defined symbols found

enter image description here

他们在我调试时突然出现,我不知道出了什么问题,因为据我所知我没有编辑那个文件。

标题:

#ifndef GUIITEMLISTREPEAT_H
#define GUIITEMLISTREPEAT_H

#include <QtWidgets>
#include "appointmentrepeat.h"

class GUIItemListRepeat : public QFrame
{
    Q_OBJECT
public:
    GUIItemListRepeat(AppointmentRepeat *appointment);
    ~GUIItemListRepeat();
    AppointmentRepeat* getItem();
signals:
    void isUpdated();
    void showDetails(AppointmentRepeat *todo);
    void remove(GUIItemListRepeat *item);
private slots:
    void showClicked();
    void deleteClicked();
private:
    AppointmentRepeat *m_repeat;
    QLabel *m_title, *m_type, *m_begin, *m_end;
    QPushButton *m_show, *m_delete;
};

#endif // GUIITEMLISTREPEAT_H

来源:

#include "guiitemlistrepeat.h"

GUIItemListRepeat::GUIItemListRepeat(AppointmentRepeat *appointment)
{
    m_repeat = appointment;

    connect(appointment, SIGNAL(updated()), this, SLOT(isUpdated()));

    m_title = new QLabel(m_repeat->getTitle());
    m_begin = new QLabel(m_repeat->getStart().toString(QString("hh:mm")));
    m_end = new QLabel(m_repeat->getEnd().toString(QString("hh:mm")));
    m_show = new QPushButton(QString("Show"));
    m_delete = new QPushButton(QString("Delete"));

    QString type;
    if (m_repeat->getType() == DAILY)
        type = tr("Dagelijks");
    else if (m_repeat->getType() == WEEKLY)
        type = tr("Wekelijks(%1)").arg(m_repeat->getDate().toString(tr("ddd")));
    else if (m_repeat->getType() == MONTHLY)
        type = tr("Maandelijks(%1)").arg(m_repeat->getDate().toString(tr("dd")));
    else
        type = tr("Jaarlijks(%1)").arg(m_repeat->getDate().toString(tr("dd/MM")));

    m_type = new QLabel(type);

    connect(m_show, SIGNAL(clicked()), this, SLOT(showClicked()));
    connect(m_delete, SIGNAL(clicked()), this, SLOT(deleteClicked()));

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget(m_type, 0, 0);
    mainLayout->addWidget(m_begin, 1, 0);
    mainLayout->addWidget(m_end, 2, 0);
    mainLayout->addWidget(m_title, 0, 1, 1, 2);
    mainLayout->addWidget(m_show, 1, 1);
    mainLayout->addWidget(m_delete, 1, 2);
    setLayout(mainLayout);

    setFrameShape(QFrame::Box);

    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
}

GUIItemListRepeat::~GUIItemListRepeat()
{
    delete m_title;
    delete m_type;
    delete m_begin;
    delete m_end;
    delete m_show;
    delete m_delete;
}

AppointmentRepeat* GUIItemListRepeat::getItem()
{
    return m_repeat;
}

void GUIItemListRepeat::showClicked()
{
    emit showDetails(m_repeat);
}

void GUIItemListRepeat::deleteClicked()
{
    emit remove(this);
}

void GUIItemListRepeat::isUpdated()
{
    m_title->setText(m_repeat->getTitle());
    m_begin->setText(m_repeat->getStart().toString(QString("hh:mm")));
    m_end->setText(m_repeat->getEnd().toString(QString("hh:mm")));

    if (m_repeat->getType() == DAILY)
        m_type->setText(tr("Dagelijks"));
    else if (m_repeat->getType() == WEEKLY)
        m_type->setText(tr("Wekelijks(%1)").arg(m_repeat->getDate().toString(tr("ddd"))));
    else if (m_repeat->getType() == MONTHLY)
        m_type->setText(tr("Maandelijks(%1)").arg(m_repeat->getDate().toString(tr("dd"))));
    else
        m_type->setText(tr("Jaarlijks(%1)").arg(m_repeat->getDate().toString(tr("dd/MM"))));
}

如果我能得到这个问题的答案,那将对我有很大帮助,因为我真的完全陷入困境和绝望:(

PS:是否与以下内容有关:未找到文件:moc_guiitemlistrepeat.obj?

编辑:如果这可以帮助你,这里是

moc_guiitemlistrepeat.obj https://dl.dropboxusercontent.com/u/110311126/moc_guiitemlistrepeat.obj

moc_guiitemlistrepeat.cpp https://dl.dropboxusercontent.com/u/110311126/moc_guiitemlistrepeat.cpp

最佳答案

问题是您将 isUpdated() 函数声明为信号,但在您的类中将其用作插槽。结果,您得到了同一函数的两个定义:一个在 moc_guiitemlistrepeat.cpp 文件(由 qmake 生成)中,另一个是 void GUIItemListRepeat::isUpdated() 定义自己写的。

要解决此问题,您只需将 isUpdated() 声明为插槽即可。

关于c++ - 突然出现LNK2005和LNK1169错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25232115/

相关文章:

Qt Designer 无法提升 QMainWindow

c++ - 链接 : fatal error LNK1104: cannot open file 'ucrtd.lib' in VS2017 RC

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - VS2010上的Boost Log链接错误

c++ - 反转字符串,奇怪的输出 C++

c++ - 我可以用 premake 打印最终组装的 gcc 命令吗?

c++ - 遍历所有 bool 组合

c++ - 修改 std::set 的元素时会发生什么?

Qt QTableView如何有一个只有复选框的列

qt - 通过 Qt 中的信号/槽设置传递类