es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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);
...
Tags:  , , ,

Answer

  1. Avatar for 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 e i2c_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:

    gcc myfile.c -o myfile -li2c
    

    Esto debería enlazar tu programa con la biblioteca libi2c y permitir que el enlazador encuentre la implementación de las funciones i2c_smbus_read_* e i2c_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 funciones i2c_smbus_read_* e i2c_smbus_write_* que estás utilizando.

Comments are closed.