C++ Qt多重定义问题

17

我正在尝试使用MinGW编译器,用C++在Qt中创建一个简单的GUI应用程序。然而,编译器告诉我在wiimotescouter.cpp的第4行上有一个“WiimoteScouter :: WiimoteScouter(QWidget *)”的多重定义错误。我使用了一个检查来确保头文件不会被多次包含,但显然它并没有起作用,我不确定原因。

以下是头文件:

#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();
}

1
这更像是链接器错误而不是编译器错误。您的.pro文件中是否有多个.cpp文件?同时,发布完整的错误消息也会有所帮助。 - Stephen Chu
2
你的C++项目为什么有.php文件?0_o - Edward Strange
我把它复制到这里的时候犯了一个错误,它是一个.cpp文件,我习惯于使用PHP。 ;) - John M.
7个回答

68

我曾经看到过这种情况,当一个源文件在项目(.pro或.pri)文件中被重复复制时。检查你的项目文件中的所有"SOURCES ="和"SOURCES +="行,并确保cpp文件没有重复出现。


2
还有其他可能的解决方案吗?我尝试了所有在SO上能找到的方法,但都对我无效。 - GuidoG

2

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


1
我正在包含。
#include myclass.cpp

替代

#include myclass.h

1
如果您在不同文件夹中有两个名称相同的.ui文件,则也可能会发生这种情况。它们对应的头文件被构建在同一个目录中,结果一个被覆盖。至少这是我的问题。

1
在我的情况下,这是由于在头文件中全局声明了该函数所致。

1
你的回答帮我节省了很多时间!谢谢你! - Anton

0

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

我的代码在Linux上编译得非常完美,但是在Windows上,链接器错误发生在以下文件中:

Message.cpp
Util.cpp

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

这些案例和扩展名不同,但在Qt编译中却造成了混乱。我只是给那些库文件添加了一个下划线,问题就解决了。


0

当我将我的插槽声明列在信号标题下而不是插槽标题下时,在头文件中出现了此错误消息。对于任何遇到这个错误消息的人来说,还有一件事要检查。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接