15

我正在尝试使用 MinGW 编译器在 Qt 中使用 C++ 创建一个简单的 GUI 应用程序(到目前为止)。但是,编译器通知我我有一个multiple definition of 'WiimoteScouter::WiimoteScouter(QWidget*)'on line 4of wiimotescouter.cpp. 我正在使用检查来确保没有多次包含标题,但显然它不起作用,我不知道为什么。

这是头文件:

#ifndef WIIMOTESCOUTER_H
#define WIIMOTESCOUTER_H

#include <QWidget>

class QLabel;
class QLineEdit;
class QTextEdit;

class WiimoteScouter : public QWidget
{
    Q_OBJECT

public:
    WiimoteScouter(QWidget *parent = 0);

private:
    QLineEdit *eventLine;
};

#endif // WIIMOTESCOUTER_H

这是cpp文件:

#include <QtGui>
#include "wiimotescouter.h"

WiimoteScouter::WiimoteScouter(QWidget *parent) :
    QWidget(parent)
{
    QLabel *eventLabel = new QLabel(tr("Event:"));
    eventLine = new QLineEdit;

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget(eventLabel, 0, 0);
    mainLayout->addWidget(eventLine, 0, 1);

    setLayout(mainLayout);
    setWindowTitle(tr("Wiimote Alliance Scouter"));
}

最后,main.cpp:

#include <QtGui>
#include "wiimotescouter.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    WiimoteScouter wiimoteScouter;
    wiimoteScouter.show();

    return app.exec();
}
4

7 回答 7

66

当源文件在项目(.pro 或 .pri)文件中重复时,我已经看到过这种情况。检查项目文件中的所有 "SOURCES =" 和 "SOURCES +=" 行,并确保 cpp 文件不存在不止一次。

于 2011-02-11T14:58:11.323 回答
2

我不使用 MinGW,但这听起来像是链接器错误而不是编译器错误。如果是这种情况,那么您应该检查 .CPP 文件是否没有两次添加到项目中。我还注意到扩展名是“php”,这很不寻常,因为它应该是“cpp”。

于 2011-02-11T02:51:10.293 回答
1

回答仅供参考:

我包括

#include myclass.cpp

代替

#include myclass.h
于 2013-08-06T00:27:10.457 回答
1

如果您在不同的文件夹中有两个同名的 .ui 文件,也会发生这种情况。它们对应的标头构建在同一目录中,导致其中一个被覆盖。至少那是我的问题。

于 2015-05-11T04:16:15.857 回答
0

当我在头文件的信号标题下列出我的插槽声明而不是插槽之一时,我收到了此错误消息。遇到此错误消息的任何人都需要检查另一件事。

剪切和粘贴解决了问题,下次我手动创建插槽时需要检查。

于 2016-02-16T14:31:01.057 回答
0

对我来说,这是由于 Qt 在 Windows 中使用 MinGW 的编译模型。

我的代码在 Linux 上编译得非常好,但对于 Windows,以下文件发生了链接器错误:

Message.cpp
Util.cpp

起初,在 .pro 文件中,我找不到任何类似的文件名。然后仔细观察我发现,我正在编译的外部 google protobuf 库在其文件夹中有一些库文件,命名为:

message.cc
util.cc

案例和扩展是不同的,但不知何故它在 Qt 编译中造成了混乱。我只是在这些库文件中添加了一个下划线,并且一切正常。

于 2017-06-08T11:45:26.173 回答
0

在我的情况下,这是由于在头文件中全局声明函数引起的。

于 2020-11-19T14:35:47.810 回答