Arduino 与 cmy 库通信时出现“Undefined reference”错误
“Undefined reference” error in communication between Arduino and cmy library
我正在尝试开始开发一个 arduino 项目。我实现了一个名为 "IMU" 的库来保存对象 Adafruit_BNO055.h 和一个卡尔曼滤波器。我按照 Arduino 教程创建库,但它不起作用。
编译时出现以下错误:
sketch\main.ino.cpp.o:(.literal._Z4loopv+0x18): undefined reference to `IMU::readAcc(double*, double*, double*)'
sketch\main.ino.cpp.o:(.literal.startup._GLOBAL__sub_I_x+0x4): undefined reference to `IMU::IMU()'
sketch\main.ino.cpp.o: In function `loop()':
C:\Users\Iagoh\Documents\Arduino\libraries\Adafruit_Unified_Sensor/Adafruit_Sensor.h:172: undefined reference to `IMU::readAcc(double*, double*, double*)'
sketch\main.ino.cpp.o: In function `_GLOBAL__sub_I_x':
C:\Users\Iagoh\Documents\Arduino\libraries\Adafruit_Unified_Sensor/Adafruit_Sensor.h:172: undefined reference to `IMU::IMU()'
collect2.exe: error: ld returned 1 exit status
exit status 1
Erro compilando para a placa TTGO LoRa32-OLED V1
IMU.H :
#ifndef imu_h
#define imu_h
// Includes sectoin see readme.md to install the packs
#include "Arduino.h"
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
/**
* Class IMU to hold data from Adafruit bn055 sensor
*
*/
class IMU
{
public:
IMU();
void readAcc(double *x, double *y, double *z);
private:
int I2C_IMU_ADDR;
int I2C_IMU_ID;
Adafruit_BNO055 _bno;
};
#endif
IMU.CPP:
#include "Arduino.h"
#include "imu/imu.h"
IMU::IMU(){
I2C_IMU_ADDR = 0x28;
I2C_IMU_ID = 55;
_bno = = Adafruit_BNO055(I2C_IMU_ID, I2C_IMU_ADDR);
if (Serial){
if (!bno.begin())
{
if (Serial){
/* There was a problem detecting the BNO055 ... check your connections */
Serial.print("Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!");
while (1);
}else
{
/* There was a problem detecting the BNO055 ... check your connections */
Serial.begin(9600);
Serial.print("Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!");
while (1);
}
}
}
}
void IMU::readAcc(double *x, double *y, double *z){
sensors_event_t linearAccelData;
_bno.getEvent(&linearAccelData, Adafruit_BNO055::VECTOR_LINEARACCEL);
*x = linearAccelData.magnetic.x;
*y = linearAccelData.magnetic.y;
*z = linearAccelData.magnetic.z;
}
main.ino:
#include "imu/imu.h"
double x,y,z;
IMU myImu = IMU();
int main_state =0;
void setup() {
// put your setup code here, to run once:
}
void loop() {
if (main_state ==0){
// Machine state 0
main_state = 1;
//Todo code here
myImu.readAcc(&x,&y,&z);
Serial.print(x);
}else if (main_state == 1 ){
// Machine state 1
main_state = 2;
//Todo code here
}else if (main_state == 2 ){
// Machine state 2
main_state = 3;
//Todo code here
}else if (main_state == 3 ){
// Machine state 3
main_state = 4;
//Todo code here
}else if (main_state == 4 ){
// Machine state 4
main_state = 5;
//Todo code here
}else if (main_state ==5 ){
// Machine state 5
main_state = 0;
//Todo code here
}
}
我刚刚解决了这个问题。我已将文件移动到 imu 文件夹之外。
现在 IMU.h 和 IMU.cpp 与 main.ino 在同一个文件夹中。
我正在尝试开始开发一个 arduino 项目。我实现了一个名为 "IMU" 的库来保存对象 Adafruit_BNO055.h 和一个卡尔曼滤波器。我按照 Arduino 教程创建库,但它不起作用。
编译时出现以下错误:
sketch\main.ino.cpp.o:(.literal._Z4loopv+0x18): undefined reference to `IMU::readAcc(double*, double*, double*)'
sketch\main.ino.cpp.o:(.literal.startup._GLOBAL__sub_I_x+0x4): undefined reference to `IMU::IMU()'
sketch\main.ino.cpp.o: In function `loop()':
C:\Users\Iagoh\Documents\Arduino\libraries\Adafruit_Unified_Sensor/Adafruit_Sensor.h:172: undefined reference to `IMU::readAcc(double*, double*, double*)'
sketch\main.ino.cpp.o: In function `_GLOBAL__sub_I_x':
C:\Users\Iagoh\Documents\Arduino\libraries\Adafruit_Unified_Sensor/Adafruit_Sensor.h:172: undefined reference to `IMU::IMU()'
collect2.exe: error: ld returned 1 exit status
exit status 1
Erro compilando para a placa TTGO LoRa32-OLED V1
IMU.H :
#ifndef imu_h
#define imu_h
// Includes sectoin see readme.md to install the packs
#include "Arduino.h"
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
/**
* Class IMU to hold data from Adafruit bn055 sensor
*
*/
class IMU
{
public:
IMU();
void readAcc(double *x, double *y, double *z);
private:
int I2C_IMU_ADDR;
int I2C_IMU_ID;
Adafruit_BNO055 _bno;
};
#endif
IMU.CPP:
#include "Arduino.h"
#include "imu/imu.h"
IMU::IMU(){
I2C_IMU_ADDR = 0x28;
I2C_IMU_ID = 55;
_bno = = Adafruit_BNO055(I2C_IMU_ID, I2C_IMU_ADDR);
if (Serial){
if (!bno.begin())
{
if (Serial){
/* There was a problem detecting the BNO055 ... check your connections */
Serial.print("Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!");
while (1);
}else
{
/* There was a problem detecting the BNO055 ... check your connections */
Serial.begin(9600);
Serial.print("Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!");
while (1);
}
}
}
}
void IMU::readAcc(double *x, double *y, double *z){
sensors_event_t linearAccelData;
_bno.getEvent(&linearAccelData, Adafruit_BNO055::VECTOR_LINEARACCEL);
*x = linearAccelData.magnetic.x;
*y = linearAccelData.magnetic.y;
*z = linearAccelData.magnetic.z;
}
main.ino:
#include "imu/imu.h"
double x,y,z;
IMU myImu = IMU();
int main_state =0;
void setup() {
// put your setup code here, to run once:
}
void loop() {
if (main_state ==0){
// Machine state 0
main_state = 1;
//Todo code here
myImu.readAcc(&x,&y,&z);
Serial.print(x);
}else if (main_state == 1 ){
// Machine state 1
main_state = 2;
//Todo code here
}else if (main_state == 2 ){
// Machine state 2
main_state = 3;
//Todo code here
}else if (main_state == 3 ){
// Machine state 3
main_state = 4;
//Todo code here
}else if (main_state == 4 ){
// Machine state 4
main_state = 5;
//Todo code here
}else if (main_state ==5 ){
// Machine state 5
main_state = 0;
//Todo code here
}
}
我刚刚解决了这个问题。我已将文件移动到 imu 文件夹之外。
现在 IMU.h 和 IMU.cpp 与 main.ino 在同一个文件夹中。