Multiple definition errors in Arduino library

9k views Asked by At

I am trying to compile the lightRobot.ino Arduino sketch from https://github.com/janisHD/LightRobot in Arduino 1.0.5, but I'm getting multiple definition errors for the functions in the lightRobot library. I'm using OS X 10.8.5 but had the same problem in Windows 8.

Here are example .h and .cpp files:

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

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

I get the following errors on compilation - I've only shown the errors for the listed pair of .h/.cpp files - there are similar ones for every file in the lightRobot library:

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

It seems that the errors are occurring in the object file, but I'm not sure why, as the header files have guards on them to prevent multiple definitions.

3

There are 3 answers

1
Lemmy On

The compilation succeeded when I moved the .ino file out of the lightRobot folder.

0
Panda On

I know you already found the answer but, for future searchers, I had this same problem. I fixed it by renaming the main folder, for the .ino, and removing any .h or .cpp files from the folder.

Note: I don't know how this happened to me but it may be an issue for someone else.

0
iced_tea On

In case anyone else comes across this question later I was having the same problem and it was fixed by deleting the tabs on the library files in my sketch. It seems to include those files there and again when you have #include "lib.h"