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()'

Итак, что не так?

, 👍2


1 ответ


2

Как справедливо отмечает Юрай, у вас опечатка, которая должна привести к следующей ошибке во время компиляции:

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>

Затем он должен скомпилироваться и линковаться без проблем

,