RaspberryPi:C 用户空间中对“i2c_smbus_read*”函数的未定义引用

RaspberryPi: undefined reference to `i2c_smbus_read*' functions in C userspace

我正在尝试编译一个用户空间 C 源文件,它在 Raspberry Pi 3B+ 内核 5.10.63-v7+ 中使用 i2c_smbus_read_*i2c_smbus_write_* 函数。根据 this Linux kernel 文档,这应该是可能的。我已经安装了 libi2c-dev.

如果我使用:

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

我运行gcc myfile.c -o myfile,我得到:

/usr/bin/ld: /tmp/ccIWkqsK.o: in function `i2c_read':
myfile.c:(.text+0x84): undefined reference to `i2c_smbus_read_byte_data'
/usr/bin/ld: /tmp/ccIWkqsK.o: in function `i2c_write':
myfile.c:(.text+0x160): undefined reference to `i2c_smbus_write_block_data'
collect2: error: ld returned 1 exit status

可能是哪个问题?


请注意,这些函数存在于我的 /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);
...

我同意您在 C 程序中不需要 extern "C"。检查您的 header 并查看您的 header 是否将函数定义为 inline。如果它只是声明它,你需要找出哪个库是在哪个库中定义的函数和link你程序中的库

编辑: 我看到你已经更新了问题。在这种情况下,您需要 link i2c 库类似于他们所做的 here。只需在您的 gcc 命令中添加一个参数:-li2c.