Неопределенная ошибка ссылки для конструктора, использующего Arduino IDE - PullRequest
1 голос
/ 05 июля 2019

Я работаю над студенческим проектом по созданию пары роботов, которые сообщают время, поднимаясь и опускаясь, используя Arduinos (включая Arduino IDE).Часть этого проекта включает в себя простой AI 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 Ответ

1 голос
/ 06 июля 2019

Согласно File / Preferences в Arduino IDE, расположение SketchBook по умолчанию равно /home/user_name/Arduino.

, поэтому файлы SpeedCorrector.h и SpeedCorrector.cpp должны быть помещены в /home/user_name/Arduino/libraries/SpeedCorrector, а не в подкаталог.той, где стоит основная (.ino) программа.

Как указано в комментариях Джураджем, главная программа (.ino) должна затем использовать #include <SpeedCorrector.h>, без полного пути к заголовкуфайл.

...