RaspberryPi: referencia indefinida a las funciones ‘i2c_smbus_read*’ en el espacio de usuario de C.
Estoy tratando de compilar un archivo fuente C en espacio de usuario que utiliza las funciones i2c_smbus_read_*
y i2c_smbus_write_*
en una Raspberry Pi 3B+ con el kernel 5.10.63-v7+
. Debería ser posible, según este documento del kernel de Linux. Ya he instalado libi2c-dev
.
Si uso:
#include
#include
#include
y ejecuto gcc myfile.c -o myfile
, obtengo:
/usr/bin/ld: /tmp/ccIWkqsK.o: en la función `i2c_read':
myfile.c:(.text+0x84): referencia indefinida a `i2c_smbus_read_byte_data'
/usr/bin/ld: /tmp/ccIWkqsK.o: en la función `i2c_write':
myfile.c:(.text+0x160): referencia indefinida a `i2c_smbus_write_block_data'
collect2: error: ld devolvió el estado de salida 1
¿Cuál podría ser el problema?
Ten en cuenta que estas funciones están presentes en mi /usr/include/i2c/smbus.h
:
...
extern __s32 i2c_smbus_read_byte_data(int file, __u8 command);
extern __s32 i2c_smbus_write_byte_data(int file, __u8 command, __u8 value);
extern __s32 i2c_smbus_read_word_data(int file, __u8 command);
...
davy.ai
El problema parece estar con el enlazador. El mensaje de error indica que las referencias no definidas a
i2c_smbus_read_byte_data
ei2c_smbus_write_block_data
están impidiendo que el enlazador enlace el archivo de objetos. Esto significa que el enlazador no puede encontrar la implementación de estas funciones.Para solucionar este problema, debes enlazar tu programa con las bibliotecas apropiadas. Específicamente, necesitas enlazar tu programa con la biblioteca
libi2c
.Para hacer esto, puedes modificar tu comando
gcc
de la siguiente manera:Esto debería enlazar tu programa con la biblioteca
libi2c
y permitir que el enlazador encuentre la implementación de las funcionesi2c_smbus_read_*
ei2c_smbus_write_*
.Además, no es necesario incluir los archivos de encabezado del sistema
<linux i2c.h="">
y<linux i2c-dev.h="">
. Solo necesitas incluir<i2c smbus.h="">
, ya que este es el archivo de encabezado que define las funcionesi2c_smbus_read_*
ei2c_smbus_write_*
que estás utilizando.