因为您的应用程序使用了错误的头文件。
如果您看到extern
在函数上i2c_smbus_read_word_data()
在你的头文件中,它是你的头文件kernel,但不适合你的应用。 Linux 内核有i2c_smbus_read_word_data()
和其他 i2c smbus 函数供其内部使用。但它们 a) 不是系统调用,或者 b) 无法从您的应用程序访问。
相反,得到来自 Linux 内核 Wiki 的 i2c-tools https://i2c.wiki.kernel.org/index.php/I2C_Tools并安装它。如果您使用 Debian,只需
sudo apt-get install libi2c-dev
and use i2c_smbus_read_word_data()
或他们提供的任何其他接口。
版本说明
i2c-dev,直到版本 3.x,曾经是一个只有头文件的包,这意味着没有可链接的库。所有函数都是使用定义的内联函数ioctl()
.
e.g.)
static inline __s32 i2c_smbus_access(int file, char read_write, __u8 command,
int size, union i2c_smbus_data *data)
{
struct i2c_smbus_ioctl_data args;
args.read_write = read_write;
args.command = command;
args.size = size;
args.data = data;
return ioctl(file,I2C_SMBUS,&args);
}
:
static inline __s32 i2c_smbus_read_word_data(int file, __u8 command)
{
union i2c_smbus_data data;
if (i2c_smbus_access(file,I2C_SMBUS_READ,command,
I2C_SMBUS_WORD_DATA,&data))
return -1;
else
return 0x0FFFF & data.word;
}
但从 v4.0 开始,它开始成为一个标准共享库libi2c.so.0
and i2c/smbus.h
。您必须在源代码中包含头文件
#include <i2c/smbus.h>
并链接libi2c.so.0
with -li2c
gcc -o a.out main.o -li2c