C++ Undefined reference to 'Class:Function()'
У меня есть эти файлы:
Проект.ino
Датчик.h
Датчик.cpp
IMU/L3G.h
IMU/L3G.cpp
Датчик.h
#ifndef Sensor_h
#define Sensor_h
#include <EEPROM.h>
#include "IMU/L3G.h"
#define CUTOFF_FREQ 30
#define FREQ 400
class Sensor {
public:
Sensor();
~Sensor();
void Init(void);
pivate:
L3G gyro;
};
#endif
Датчик.cpp
#include "Sensor.h"
Sensor::Sensor()
{
}
Sensor::~Sensor()
{
}
void Sensor::Init(void)
{
if (!gyro.init())
{
Serial.println("Failed to autodetect gyro type!");
while (1);
}
gyro.enableDefault();
}
Проект.ino
#include <i2c_t3.h>
#include <EEPROM.h>
#include <Servo.h>
#include "Sensor.h"
Sensor sensor = Sensor();
void setup() {
sensor.Init();
}
Я получил эту ошибку
/var/folders/8q/rbt7zf3d28b3k9t6d24k5sn00000gn/T/arduino_build_748953/sketch/Sensor.cpp.o: In function `Sensor::Init()':
/var/folders/8q/rbt7zf3d28b3k9t6d24k5sn00000gn/T/arduino_build_748953/sketch/Sensor.cpp:15: undefined reference to `L3G::init(unsigned char, unsigned char)'
/var/folders/8q/rbt7zf3d28b3k9t6d24k5sn00000gn/T/arduino_build_748953/sketch/Sensor.cpp:20: undefined reference to `L3G::enableDefault()'
Итак, что не так?
@user3552818, 👍2
1 ответ
Как справедливо отмечает Юрай, у вас опечатка, которая должна привести к следующей ошибке во время компиляции:
In file included from sketch/Sensor.cpp:1:0:
Sensor.h:17: error: 'pivate' does not name a type
pivate:
^
Вот правильный код для Sensor.h
#ifndef Sensor_h
#define Sensor_h
#include <EEPROM.h>
#include "IMU/L3G.h"
#define CUTOFF_FREQ 30
#define FREQ 400
class Sensor {
public:
Sensor();
~Sensor();
void Init(void);
private:
L3G gyro;
};
#endif
Использование Arduino IDE 1.8.5 с Teensyduino 1.42 с:
- https://github.com/pololu/l3g-arduino
- https://github.com/nox771/i2c_t3
Однако, как только опечатка будет исправлена, как указано выше, я тоже смогу воспроизвести вашу проблему (в некотором роде) с этими ошибками в ссылках:
/var/folders/kp/xv3y9k114yq2_64pf8zwh76h0000gp/T/arduino_build_136680/sketch/Sensor.cpp.o: In function `Sensor::Sensor()':
/var/folders/kp/xv3y9k114yq2_64pf8zwh76h0000gp/T/arduino_build_136680/sketch/Sensor.cpp:3: undefined reference to `L3G::L3G()'
/var/folders/kp/xv3y9k114yq2_64pf8zwh76h0000gp/T/arduino_build_136680/sketch/Sensor.cpp.o: In function `Sensor::Init()':
/var/folders/kp/xv3y9k114yq2_64pf8zwh76h0000gp/T/arduino_build_136680/sketch/Sensor.cpp:14: undefined reference to `L3G::init(L3G::deviceType, L3G::sa0State)'
/var/folders/kp/xv3y9k114yq2_64pf8zwh76h0000gp/T/arduino_build_136680/sketch/Sensor.cpp:19: undefined reference to `L3G::enableDefault()'
/var/folders/kp/xv3y9k114yq2_64pf8zwh76h0000gp/T/arduino_build_136680/core/core.a(main.cpp.o): In function `main':
/Volumes/Home/Users/user/Local_Apps/Arduino/Arduino1.8.5-Teensy.app/Contents/Java/hardware/teensy/avr/cores/teensy3/main.cpp:53: undefined reference to `loop'
collect2: error: ld returned 1 exit status
Multiple libraries were found for "Servo.h"
Used: /Volumes/Home/Users/user/Local_Apps/Arduino/Arduino1.8.5-Teensy.app/Contents/Java/hardware/teensy/avr/libraries/Servo
Not used: /Volumes/Home/Users/user/Local_Apps/Arduino/Arduino1.8.5-Teensy.app/Contents/Java/libraries/Servo
Error compiling for board Teensy 3.5.
Вы, вероятно, получаете эту ошибку, потому что вы поместили файлы L3G.cpp
и L3G.h
в папку с именем IMU
в той же папке, что и ваш файл .ino
. Это вызывает неопределенную ошибку, так как, хотя IDE видит объявление в файле L3G.h
, IDE не может найти определение в файле L3G.cpp
.
Это легко решить.
Если вы загрузите файл l3g-arduino-master.zip
с https://github.com/pololu/l3g-arduino, а затем в среде Arduino IDE вы добавите заархивированную библиотеку L3G в библиотеку Arduino, используя Sketch ► Include Library ► Add. ZIP Library...
, а затем измените строку
#include "IMU/L3G.h"
к
#include <L3G.h>
Затем он должен скомпилироваться и линковаться без проблем
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Массив динамического размера в качестве члена класса
- Как перебрать объекты или передать объект функции?
- Прерывания внутри класса, связанные с функцией класса
- Недопустимое использование нестатической функции-члена
- Вызов функций одного класса из другого класса — Обратный вызов
- Зачем хранить значение параметра функции в частной переменной класса?
- Альтернатива опросу флага прерывания из основного цикла?