C++ Arduino库中存在多个定义错误

C++ Arduino库中存在多个定义错误,c++,arduino,multiple-definition-error,C++,Arduino,Multiple Definition Error,我试图从Arduino 1.0.5中编译lightRobot.ino Arduino草图,但是lightRobot库中的函数出现了多个定义错误。 我使用的是OS X 10.8.5,但在Windows 8中也有同样的问题 下面是示例.h和.cpp文件: BlueToothEvent.h /*! \file BlueToothEvent.h checks periodically if new data over BT has been received. */ #include <Ardu

我试图从Arduino 1.0.5中编译lightRobot.ino Arduino草图,但是lightRobot库中的函数出现了多个定义错误。 我使用的是OS X 10.8.5,但在Windows 8中也有同样的问题

下面是示例.h和.cpp文件:

BlueToothEvent.h

/*! \file BlueToothEvent.h checks periodically if new data over BT has been received.
*/

#include <Arduino.h>
#include <OrangutanLCD.h>
#include "TimeEvent.h"

#ifndef BLUETOOTH_EVENT_H
#define BLUETOOTH_EVENT_H

#define DATA_WORD_LENGTH 4

/*! \class BlueToothEvent
retrieves and stores the received BT data. The data should come over the serialport, it must be started in "setup".
The struct DataPacket publishes the parsed data for the Statemanager.
*/
class BlueToothEvent : public TimeEvent
{
  public:

  struct DataPacket {
  char speed;
  char direction;
  int color[4]; // [3]==blue [2]==green [1]==red [0]==brightness
  int mode[2]; // [1]==color mode (0000->remote, 0001->blink, 0010->random, 0011->random&blink)   [0]==drive mode (0000->remote, 0001->random) 

    };

  BlueToothEvent();
  ~BlueToothEvent(){};

  /*! Callback which is executed periodically*/
  virtual void onTimeEvent();
  /*! Returns an internal state.*/
  virtual unsigned char getInternalState();
  /*! Sets an internal state.*/
  virtual void setInternalState(unsigned char state, bool update=false);
  /*! Executes a more complex (and time consuming) action.*/
  virtual void executeAction();

  /*! To get the received data in the DataPacket struct
  \return The most recent data received via Serial connection
  */
  DataPacket getDataPacket();

  bool m_new_data_present;



private:

/*! Processes the array with a 4 byte data word and saves the information in the DataPacket field.
\param data the array (must have the length of 4 bytes)
*/
void processData(unsigned char* data);

  private:

  enum Data{
    velocity=0,//desired velocity
    direction,//direction to drive
    color,//desired color of the LEDs
    mode,//the different modes: remote, random, blink
  };

  unsigned char m_data[DATA_WORD_LENGTH];

  struct DataPacket m_data_packet;

};

#endif

似乎错误发生在目标文件中,但我不确定为什么,由于头文件上有防护装置以防止多个定义。

当我将.ino文件移出lightRobot文件夹时,编译成功。

如果以后有人遇到这个问题,我也遇到了同样的问题,通过删除草图中库文件上的选项卡修复了这个问题。当你有
#include“lib.h”
时,它似乎会在那里反复包含这些文件,我知道你已经找到了答案,但对于未来的搜索者,我也遇到了同样的问题。我通过重命名.ino的主文件夹并从文件夹中删除任何.h或.cpp文件来修复它


注意:我不知道这是怎么发生在我身上的,但这可能是其他人的问题。

您正在将已编译的源文件与已编译的旧文件链接起来。“你在构建之前尝试清理吗?”@ LSSDEV我不确定如何在ARDUNO中这样做——我相信它是在C++编译器之上构建的,但它只是提供了“验证/编译”选项,这就是我一直在做的。无论如何,您应该再次指定中间文件(
.o
)作为输入文件。建议:创建一个新项目,并将现有的
BlueToothEvent.h
BlueToothEvent.cpp
添加到其中。图例!这个给我修好了。谢谢
#include "BlueToothEvent.h"

 BlueToothEvent::BlueToothEvent():
 TimeEvent(),
 m_new_data_present(false)
{
  //init data array

  m_data[velocity] = 0;
  m_data[direction] = 0;
  m_data[color] = 0;
  m_data[mode] = 0;

  processData(m_data);
  //Serial connection
}

void BlueToothEvent::onTimeEvent()
{   
    //Code to receive a single data word and store it in m_data field
        //Word consists of 4 chars (see the docu for further explanations): 

        //[0] -> direction to drive [0-254]
        //[1] -> velocity to drive [0-254]
        //[2] -> desired color for the Light [0-254] in 2 bit packets -> b0[0,3]->Brightnes | [0,3]->Red| [0,3]->Green | [0,3]->Blue
        //[3] -> internal mode (see responsible class)[0-254]

        if(Serial.available() >= DATA_WORD_LENGTH)
        {//minimum number of bytes must be available in the buffer
          while(Serial.available() > DATA_WORD_LENGTH)
            Serial.read();//clear buffer except the last 4 bits

          m_data[velocity] = (char)Serial.read();
          m_data[direction] = (char)Serial.read();
          m_data[color] = (char)Serial.read();
          m_data[mode] = (char)Serial.read();

          processData(m_data); 
          m_new_data_present = true;
        }
}

void BlueToothEvent::processData(unsigned char* data)
{
  m_data_packet.speed = data[velocity];
  m_data_packet.direction = data[direction];
  m_data_packet.color[0] = data[color] & 0b00000011;
  m_data_packet.color[1] = (data[color] & 0b00001100)>>2;
  m_data_packet.color[2] = (data[color] & 0b00110000)>>4;
  m_data_packet.color[3] = (data[color] & 0b11000000)>>6;
  m_data_packet.mode[0] = data[mode] & B00001111;
  m_data_packet.mode[1] = (data[mode] & B11110000)>>4;
}


BlueToothEvent::DataPacket BlueToothEvent::getDataPacket()
{
  m_new_data_present = false;
  return m_data_packet;
}

//unsigned char BlueToothEvent::getData(unsigned char field)
//{
//  if(field <= mode)
//    return m_data[field];
//  else
//    return 0;
//}

unsigned char BlueToothEvent::getInternalState()
{
  return m_data[mode];
}

void BlueToothEvent::setInternalState(unsigned char state, bool update)
{
  //nothing to do here!
}

void BlueToothEvent::executeAction()
{
    //nothing to do here!
}
lightRobot/BlueToothEvent.cpp.o: In function `BlueToothEvent::processData(unsigned char*)':
/Users/lemmy/Documents/Arduino/libraries/lightRobot/BlueToothEvent.cpp:43: multiple definition of `BlueToothEvent::processData(unsigned char*)'
BlueToothEvent.cpp.o:BlueToothEvent.cpp:43: first defined here
lightRobot/BlueToothEvent.cpp.o: In function `BlueToothEvent':
/Users/lemmy/Documents/Arduino/libraries/lightRobot/BlueToothEvent.cpp:4: multiple definition of `BlueToothEvent::BlueToothEvent()'
BlueToothEvent.cpp.o:BlueToothEvent.cpp:4: first defined here
lightRobot/BlueToothEvent.cpp.o: In function `BlueToothEvent':
/Users/lemmy/Documents/Arduino/libraries/lightRobot/BlueToothEvent.cpp:4: multiple definition of `BlueToothEvent::BlueToothEvent()'
BlueToothEvent.cpp.o:BlueToothEvent.cpp:4: first defined here
lightRobot/BlueToothEvent.cpp.o: In function `BlueToothEvent::getDataPacket()':
/Users/lemmy/Documents/Arduino/libraries/lightRobot/BlueToothEvent.cpp:56: multiple definition of `BlueToothEvent::getDataPacket()'
BlueToothEvent.cpp.o:BlueToothEvent.cpp:56: first defined here
lightRobot/BlueToothEvent.cpp.o: In function `BlueToothEvent::getInternalState()':
/Users/lemmy/Documents/Arduino/libraries/lightRobot/BlueToothEvent.cpp:73: multiple definition of `BlueToothEvent::getInternalState()'
BlueToothEvent.cpp.o:BlueToothEvent.cpp:73: first defined here
lightRobot/BlueToothEvent.cpp.o: In function `BlueToothEvent::setInternalState(unsigned char, bool)':
/Users/lemmy/Documents/Arduino/libraries/lightRobot/BlueToothEvent.cpp:78: multiple definition of `BlueToothEvent::setInternalState(unsigned char, bool)'
BlueToothEvent.cpp.o:BlueToothEvent.cpp:78: first defined here
lightRobot/BlueToothEvent.cpp.o: In function `BlueToothEvent::executeAction()':
/Users/lemmy/Documents/Arduino/libraries/lightRobot/BlueToothEvent.cpp:83: multiple definition of `BlueToothEvent::executeAction()'
BlueToothEvent.cpp.o:BlueToothEvent.cpp:83: first defined here
lightRobot/BlueToothEvent.cpp.o: In function `BlueToothEvent::onTimeEvent()':
/Users/lemmy/Documents/Arduino/libraries/lightRobot/BlueToothEvent.cpp:18: multiple definition of `BlueToothEvent::onTimeEvent()'
BlueToothEvent.cpp.o:BlueToothEvent.cpp:18: first defined here