You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Ubuntu 18.04后Qt编译报错:undefined reference to `i2c_smbus_read_word_data`

解决Ubuntu 18.04下Qt编译i2c_smbus函数未定义的问题

我之前也碰到过一模一样的问题,Ubuntu 18.04确实对i2c相关函数的实现做了调整——i2c_smbus_read_word_data这类函数不再内嵌在头文件里,必须显式链接libi2c库才行。你已经装了必要的包,问题大概率出在头文件引用或者Qt项目的链接配置顺序上,试试下面的步骤:

1. 补全头文件引用

Ubuntu 18.04开始,i2c_smbus_read_word_data的函数声明从linux/i2c-dev.h移到了i2c/smbus.h里,所以你的代码里必须同时包含这两个头文件:

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

如果只包含前者,编译器虽然不会报错,但链接阶段会找不到函数定义。

2. 正确配置Qt项目的.pro文件

Qt的qmake对链接库的顺序很敏感,一定要把-li2c放在所有依赖它的源文件之后(或者直接在.pro里单独添加,qmake会自动处理顺序,但最好确保它在SOURCES之后)。比如你的.pro文件可以这样写:

QT += core gui

TARGET = YourI2CApp
TEMPLATE = app

SOURCES += main.cpp \
           i2c_worker.cpp  # 假设这个文件用到了i2c_smbus函数

HEADERS += i2c_worker.h

# 关键:添加libi2c的链接
LIBS += -li2c

3. 清理构建缓存,重新编译

有时候Qt Creator的旧构建缓存会导致链接配置不生效,按这个流程操作:

  • 点击Qt Creator顶部菜单栏的Build -> Clean All
  • 然后点击Build -> Run qmake
  • 最后重新点击Build -> Build All

4. 静态链接的注意事项

如果你坚持用静态链接libi2c.a,要确保在.pro里完整指定路径,并且这个路径要放在所有源文件之后:

LIBS += /usr/lib/x86_64-linux-gnu/libi2c.a

不过更推荐动态链接-li2c,它会自动处理依赖,更省心。

额外排查点

  • 确认libi2c-dev安装无误:运行dpkg -l libi2c-dev,输出里应该显示ii开头的已安装状态
  • 检查编译输出:在Qt Creator的Compile Output标签里找到链接阶段的命令,确认-li2c(或者静态库路径)确实出现在命令里,而且在你的目标文件之后

按这些步骤来,应该就能解决链接错误了。

内容的提问来源于stack exchange,提问作者vitperov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:43:03