référence non définie à `i2c_smbus_read_block_data (int, unsigned char, unsigned char *) '

Aug 31 2020

J'essaie de lire un bloc de données à partir d'un imu (mpu9250) mais lors de la construction avec g++ mpu.cpp -o mpuj'obtiens l'erreur suivante:

/tmp/cckh5V8w.o: In function 'imu::read_accel()': 
mpu_mine9250.cpp:(.text._ZN3imu10read_accelEv[_ZN3imu10read_accelEv]+0x94): undefined reference to 'i2c_smbus_read_block_data(int, unsigned char, unsigned char*)'
collect2: error: ld returned 1 exit status ```
int addr = 0x68;
int mpu_file;
char mpu_filename[250];
snprintf(mpu_filename, 250, "/dev/i2c-0");
if (ioctl(mpu_file, I2C_SLAVE, addr) < 0){
     exit(1);
}
__u8 buf[14];
__u8 reg = 0x3B;
int ans= i2c_smbus_read_block_data(mpu_file, reg, buf);

Pour inclure les bibliothèques que j'ai essayées:

#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <i2c/smbus.h>

et aussi:

extern "C" {
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <i2c/smbus.h>
}

J'ai installé les packages libi2c-dev, libi2c0 et i2c-tools.

Lors de l'utilisation write(mpu_file, buf, 2)ou read(mpu_file, buf, 1)cela fonctionne.

Merci d'avance!

Réponses

1 AdamElMessaoudi Aug 31 2020 at 16:50

Les solutions étaient:

1. En utilisant extern C: J'utilisais extern C, mais je les ai également inclus de la manière habituelle et cela a causé le problème.

extern "C"
{
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <i2c/smbus.h>
}

2. Lier les bibliothèques lors de la construction:

g++ -o mpu mpu_mine9250.cpp -li2c