升级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
相关产品推荐
相关产品推荐

