Arduino库中的多个定义错误

 dasgsdfsddsadas_501 发布于 2023-02-07 20:11

我正在尝试从Arduino 1.0.5中的https://github.com/janisHD/LightRobot编译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 
#include 
#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!
}

我在编译时遇到以下错误 - 我只显示了列出的.h/.cpp文件对的错误 - 对于lightRobot库中的每个文件都有类似的错误:

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

似乎错误发生在目标文件中,但我不确定为什么,因为头文件有防护它们以防止多个定义.

1 个回答
  • 如果其他人后来遇到这个问题,我遇到了同样的问题,并通过删除草图中库文件的选项卡来修复它.它似乎包括那些文件,当你有#include "lib.h"

    2023-02-07 20:15 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有