【问题标题】:C++ Qt Multiple DefinitionsC++ Qt 多重定义
【发布时间】:2011-06-25 07:00:09
【问题描述】:

我正在尝试使用 MinGW 编译器在 Qt 中使用 C++ 创建一个简单的 GUI 应用程序(到目前为止)。但是,编译器通知我在line 4wiimotescouter.cpp 上有一个multiple definition of '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();
}

【问题讨论】:

  • 这听起来更像是链接器错误,而不是编译器错误。您的 .pro 文件中是否有多个 .cpp 文件?并且发布完整的错误消息也会有所帮助。
  • 为什么你的 C++ 项目中有 .php 文件? 0_o
  • 我的错误将它复制到这里,它是一个 .cpp,我习惯于使用 PHP。 ;)

标签: c++ qt multiple-definition-error


【解决方案1】:

我以前曾见过在项目(.pro 或 .pri)文件中复制源文件时发生这种情况。检查项目文件中的所有 "SOURCES =" 和 "SOURCES +=" 行,并确保 cpp 文件不存在多次。

【讨论】:

  • 任何其他可能的解决方案?我尝试了所有我能找到的东西,但对我没有任何作用
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    回答仅供参考:

    我包括

    #include myclass.cpp
    

    而不是

    #include myclass.h
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

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

          Message.cpp
          Util.cpp
          

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

          message.cc
          util.cc
          

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2021-12-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多