На странице, на которую вы ссылаетесь, написано:
В версии Buster, по состоянию на июнь 2019 года, необходимые сведения для использования i2c_smbus_write_byte_data () и братьев и сестер требуют следующих операторов include:
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/i2c-dev.h>
#include <i2c/smbus.h>
Используя fgrep, вы можете подтвердить, что функция объявлена в /usr/include/i2c/smbus.h:
# cd /usr/include; fgrep -R i2c_smbus_write_byte *
i2c/smbus.h:extern __s32 i2c_smbus_write_byte(int file, __u8 value);
i2c/smbus.h:extern __s32 i2c_smbus_write_byte_data(int file, __u8 command, __u8 value);
Итак, это должно работать:
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/i2c-dev.h>
#include <i2c/smbus.h>
int main(void) {
int i2c = open("/dev/i2c-1", O_RDWR);
i2c_smbus_write_byte(i2c, 1);
close(i2c);
return 0;
}
Я проверил, что этот пример успешно компилируется в последней версии Raspbian Buster Lite:
gcc test.c -otest -li2c
Если вы используете g ++ вместо g cc, тогда вы должны заключить директивы include с extern " C ":
extern "C" {
#include <linux/i2c-dev.h>
#include <i2c/smbus.h>
}