使用 Arduino IDE 的构造函数的未定义引用错误
Undefined Reference error for Constructor using Arduino IDE
我正在开展一个学生项目,旨在使用 Arduinos(包括 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)'
那里得到了关于如何制作库的说明
根据 arduino IDE 中的 File/Preferences,默认的 SketchBook 位置是 /home/user_name/Arduino
。
所以 SpeedCorrector.h
和 SpeedCorrector.cpp
文件应该放在 /home/user_name/Arduino/libraries/SpeedCorrector
中,而不是放在主程序 (.ino
) 所在的子目录中。
正如 Juraj 在评论中所述,主程序 (.ino
) 应该使用 #include <SpeedCorrector.h>
,没有任何头文件的完整路径。
我正在开展一个学生项目,旨在使用 Arduinos(包括 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)'
那里得到了关于如何制作库的说明
根据 arduino IDE 中的 File/Preferences,默认的 SketchBook 位置是 /home/user_name/Arduino
。
所以 SpeedCorrector.h
和 SpeedCorrector.cpp
文件应该放在 /home/user_name/Arduino/libraries/SpeedCorrector
中,而不是放在主程序 (.ino
) 所在的子目录中。
正如 Juraj 在评论中所述,主程序 (.ino
) 应该使用 #include <SpeedCorrector.h>
,没有任何头文件的完整路径。