Ошибка множественного определения в одной строке - PullRequest
0 голосов
/ 04 декабря 2018

GCC, кажется, жалуется на множественные определения функции.Я получаю две ошибки, которые указывают на одну и ту же строку:

arControls.cpp:5: error: multiple definition of `arControls::arControls(QCheckBox*, QSpinBox*, QSpinBox*)'

arcontrols.h:

#pragma once

#include <QObject>
class QCheckBox;
class QSpinBox;

class arControls: public QObject
{
   Q_OBJECT

   public: 
   arControls(void) = delete;
   arControls(QCheckBox* arCB,
              QSpinBox* sb1,
              QSpinBox* sb2);

protected:
   QCheckBox* _arCB;
   QSpinBox* _sb1;
   QSpinBox* _sb2;

};

arcontrols.cpp:

#include "arControls.h"

arControls::arControls(QCheckBox* arCB,
                       QSpinBox* sb1,
                       QSpinBox* sb2)
{
  //Populate pointers
  _arCB = arCB;
  _sb1 = sb1;
  _sb2 = sb2;
}

Эта ситуация возникаетотличаться от других .Я не помещал реализацию в заголовок или включал реализацию в другом месте кода.

Заголовок включается только дважды.Однажды в реализации.

QT Designer с использованием gcc complier.

1 Ответ

0 голосов
/ 04 декабря 2018

Как отмечают некоторые из комментаторов, такая проблема чаще всего возникает из-за попытки дважды скомпилировать один и тот же файл.

  • Включение файла реализации (.cpp) - быстрый способ сделать это.

  • Другой способ компилировать файл дважды - включитьэто дважды в проекте, который создал этот вопрос.Это произошло хитрым способом, который не проявился в IDE, в данном случае, QT Creator.

В этом случае arControls.h и arControls.cpp, показанные в вопросе,были созданы, а затем явно добавлены в проект с помощью графической среды IDE, щелкнув правой кнопкой мыши папку и выбрав «Добавить существующий файл».Файл появился в дереве, как и ожидалось.Добавление файла таким способом привело к редактированию файла проекта.Среда IDE обнаружила экземпляр SOURCES и добавила явно добавленный файл:

SOURCES     += $$COMMON/status/explicitfile1.cpp \
               $$COMMON/status/explicitfile2.cpp \
               $$COMMON/status/explicitfile3.cpp \
        ../src/arControls.cpp

Глядя в других местах файлов проекта, мы находим следующие строки:

SRC     = $$ROOT/src
INCLUDEPATH +=  $$SRC 
HEADERS     +=  $$SRC/*.h
SOURCES     +=  $$SRC/*.cpp

Ранее разработчики использовали символы подстановкив файле проекта, чтобы включить все файлы в папке src.Добавленные файлы не были обнаружены в IDE, когда они были добавлены вручную, и в IDE никогда не появлялось намека на то, что файл был добавлен в проект дважды. В исходном дереве была видна только одна копия .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...