同一行上有多个定义错误

时间:2018-12-04 17:13:49

标签: c++ qt

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;
}

这种情况似乎与others不同。我没有将实现放在标题中,也没有在代码中的其他地方包括实现。

该标头仅包含两次。一旦实施。

使用gcc编译器的QT设计器。

1 个答案:

答案 0 :(得分:0)

正如一些评论者提到的那样,看来这种问题通常是由于尝试将同一文件两次编译而引起的。

  • 包括实现(.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从未出现过提示该文件已两次添加到项目中的提示。 在源树中只有一个副本可见