使用Arduino IDE的构造函数的未定义参考错误

时间:2019-07-05 12:05:00

标签: c++ arduino arduino-ide

我正在一个学生项目上创建一对机器人,这些机器人使用Arduino(包括Arduino IDE)通过上下移动来显示时间。该项目的一部分包括一个简单的ML AI,它将自动调整机器人的速度,以确保其以正确的速度到达顶部。我已经制作了一个库,以提供执行此任务所需的变量和函数。

在该库的早期版本中(编译得很好),只有一个构造函数使用数组存储数据,因此数组长度始终是特定长度。在下一版本中,由于Arduino IDE不允许使用向量库,因此将构造另一个构造函数以允许在构造时指定数组长度。但是,当尝试使用设置和循环功能编译源代码时,将使用对构造函数的未定义引用错误。忽略无关的代码,我的代码库看起来像

主程序

#include "libraries/SpeedCorrector/SpeedCorrector.h"

const uint8_t MAX_HOURS = 12; //12 hour clock
const uint32_t CORRECT_TIME = MAX_HOURS*60*60*1000; //Num of milliseconds in 12 hours
const uint16_t INITIAL_PWM = 300; //dummy initial PWM value for testing

uint32_t climbTime;
uint16_t currentPwm;
uint16_t tempPwm;
bool photoInterruptMet = false;

SpeedCorrector speedCorrector(INITIAL_PWM, CORRECT_TIME);

SpeedCorrector.h

#ifndef SpeedCorrector_h
#define SpeedCorrector_h

#include "Arduino.h"

class SpeedCorrector {
    public:
        const static uint8_t MAX_NUM_OF_PWM = 10; //default value
        const static uint16_t MOTOR_SLIP_CORRECTION = 10; //default value

        SpeedCorrector(uint16_t initialPwm, uint32_t inCorrectTime);
        SpeedCorrector(uint16_t initialPwm, uint32_t inCorrectTime, uint8_t inMaxNumOfPwm, uint8_t inMotorSlipCorrection);
    private:
        uint8_t pwmIndex;
        uint8_t maxNumOfPwms;
        bool correctedPwmsFull;
        uint32_t correctTime;
        uint8_t motorSlipCorrection;
};

#endif

SpeedCorrector.cpp

#include "Arduino.h"
#include "SpeedCorrector.h"

SpeedCorrector::SpeedCorrector(uint16_t initialPwm, uint32_t inCorrectTime) {
    pwmIndex = 0;
    maxNumOfPwms = MAX_NUM_OF_PWMS;
    uint16_t correctedPwms[maxNumOfPwms];
    correctedPwmsFull = false;
    correctedPwms[0] = initialPwm;
    correctTime = inCorrectTime;
    motorSlipCorrection = MOTOR_SLIP_CORRECTION;
}

SpeedCorrector::SpeedCorrector(uint16_t initialPwm, uint32_t inCorrectTime, 
                          uint8_t inMaxNumOfPwms, uint8_t inMotorSlipCorrection) {
  pwmIndex = 0;
  maxNumOfPwms = inMaxNumOfPwms
  uint16_t correctedPwms[maxNumOfPwms];
  correctedPwmsFull = false;
  correctedPwms[0] = initialPwm;
  correctTime = inCorrectTime;
  motorSlipCorrection = inMotorSlipCorrection;
}

不幸的是,我不得不在构造函数中声明数组,以允许在构造时指定长度。

我试图注释掉数组,以查看是否收到不同的错误消息,但无济于事。我还将库移到了另一个目录,但出现了no such file or directory错误,因此它肯定是在检测库。

该错误抱怨主程序中SpeedCorrector的构造,说明

undefined reference to `SpeedCorrector::SpeedCorrector(unsigned int, unsigned long)'

我从https://www.arduino.cc/en/Hacking/LibraryTutorial得到了有关如何制作库的说明

1 个答案:

答案 0 :(得分:1)

根据arduino IDE中的“文件/首选项”,默认的SketchBook位置为/home/user_name/Arduino

因此,SpeedCorrector.hSpeedCorrector.cpp文件应放置在/home/user_name/Arduino/libraries/SpeedCorrector中,而不是放在主程序(.ino)所在的子目录中。

如Juraj在评论中所述,主程序(.ino)应该使用#include <SpeedCorrector.h>,而没有头文件的完整路径。