未定义对 `i2c_smbus_read_word_data(int, unsigned char)` 的引用

11

在升级到Ubuntu 18.04之后,我无法编译我的Qt应用程序。

出现以下错误:

undefined reference to `i2c_smbus_read_word_data(int, unsigned char)

我理解的是,i2c_smbus_read_word_data现在不再定义在linux/i2c-dev.h中,而是在动态库/usr/lib/x86_64-linux-gnu/libi2c.so中定义。

我尝试进行动态链接:

-li2c

并以静态方式:

/usr/lib/x86_64-linux-gnu/libi2c.a

但我仍然遇到编译错误。

更新: 已安装libi2c-dev、libi2c0和i2c-tools软件包。


1
不,这是一个新的东西,他们重新设计了如何创建I2C工具以避免在那个问题中提到的问题,即存在两个同名的内核空间和用户空间包含文件,不幸的是,并非所有指南都是最新的。 - r_ahlskog
但是你确切的问题是什么?看起来你只考虑了一种可能的解决方案,但可能还有其他的解决方案。 - user1742529
1个回答

25

smbus的包含不像大多数供一般使用的C头文件那样准备好用于C++,因此它没有一个extern "C"声明,这意味着C++编译器会对名称进行更改,导致链接失败。

在我有偶然想法之前,我花了几个小时苦思冥想。通过将包含语句包装在extern "C"块中,我解决了问题,现在我的程序可以正常链接。

extern "C" {
    #include <linux/i2c-dev.h>
    #include <i2c/smbus.h>
}

4
伙计,这个提示太棒了! - Jonas Witt
2
老实说,这值得一杯啤酒! - Maxim Sloyko
1
2022年仍然很好!干杯 - hans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接