我正在尝试使用 MinGW 编译器在 Qt 中使用 C++ 创建一个简单的 GUI 应用程序(到目前为止)。然而,编译器通知我,我在
multiple definition of 'WiimoteScouter::WiimoteScouter(QWidget*)'
的 line 4
上有一个 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();
}
我以前见过当源文件在项目(.pro 或 .pri)文件中重复时发生这种情况。检查项目文件中的所有“SOURCES =”和“SOURCES +=”行,并确保 cpp 文件不在其中多次。
我不使用 MinGW,但这听起来像是链接器错误而不是编译器错误。如果是这种情况,那么您应该检查 .CPP 文件是否两次添加到项目中。我还注意到扩展名是“php”,这很不寻常,因为它应该是“cpp”。
答案仅供参考:
我包括了
#include myclass.cpp
而不是
#include myclass.h
如果不同文件夹中有两个同名的 .ui 文件,也可能会发生这种情况。它们对应的标头构建在同一目录中,导致其中一个被覆盖。至少那是我的问题。
在我的例子中,这是由于在头文件中全局声明函数而导致的。
当我在头文件中的信号标题下列出插槽声明而不是插槽声明时,我收到此错误消息。对于遇到此错误消息的人来说,还有另一件事需要检查。
剪切和粘贴解决了问题,下次手动创建插槽时需要检查。
对我来说,这是由于 Qt 在 Windows 中使用 MinGW 的编译模型。
我的代码在 Linux 上编译得很好,但对于 Windows,以下文件发生了链接器错误:
Message.cpp
Util.cpp
起初,在.pro文件中,我找不到任何类似的文件名。然后敏锐地观察我发现,我正在编译的外部 google protobuf 库在其文件夹内有一些库文件,名为:
message.cc
util.cc
案例和扩展是不同的,但不知何故它在 Qt 编译中造成了混乱。我刚刚在这些库文件中添加了一个下划线,一切正常。
我正在为同样的错误而苦苦挣扎。就我而言,错误在于我在“信号”下声明了该方法,而必须在“槽”下声明它。