C++ Qt Несколько определений

Я пытаюсь создать простое приложение GUI (пока) в Qt с C++, используя компилятор MinGW. Тем не менее, компилятор сообщает мне, что у меня есть 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();
}

6 ответов

Решение

Я видел это раньше, когда исходный файл дублировался в файле проекта (.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 я не мог найти похожие имена файлов. Затем, внимательно наблюдая, я понял, что во внешней библиотеке protobuf Google, которую я компилировал, в ее папке были некоторые библиотечные файлы с именем:

message.cc
util.cc

Случаи и расширения были разными, но каким-то образом это создавало беспорядок в компиляции Qt. Я просто добавил подчеркивание к этим файлам библиотеки, и все работало нормально.

Я получил это сообщение об ошибке, когда мои объявления слотов были перечислены под заголовком сигналов в заголовочном файле, а не слотами. Еще одна вещь для тех, кто испытывает это сообщение об ошибке, чтобы проверить.

Вырезать и вставлять решил проблему и необходимость проверить в следующий раз, когда я создаю слоты вручную.

Другие вопросы по тегам