Yocto构建含Modbus库的C程序报错:modbus.h文件不存在
解决Yocto中依赖libmodbus的C程序编译找不到头文件问题
问题根源
编译时出现modbus.h: No such file or directory错误,核心原因有两点:
- 编译阶段未正确引入包含头文件的libmodbus开发包
- 手动指定的头文件路径错误(
${D}是安装目录,编译阶段该路径下还不存在头文件)
分步修正Recipe
1. 修正依赖声明
- 编译依赖需指定
libmodbus-dev(而非仅libmodbus),因为libmodbus仅提供运行时共享库,libmodbus-dev包含编译所需的头文件、链接配置 - 添加运行时依赖,确保目标板运行程序时能找到libmodbus库
2. 简化编译命令
Yocto会自动将DEPENDS中库的头文件路径加入${CFLAGS},链接路径加入${LDFLAGS},无需手动指定-I路径。修改do_compile函数,利用Yocto自动生成的编译变量即可。
3. 清理冗余配置
移除不必要的FILES_${PN} += "${libdir}/*.so"、FILES_SOLIBSDEV、INSANE_SKIP_${PN}等配置,避免打包无关文件或触发不必要的检查。
修正后的完整Recipe
SUMMARY = "modbustest Recipe" LICENSE = "CLOSED" SRC_URI = "file://test.c" # 编译依赖:获取头文件和编译链接信息 DEPENDS += "libmodbus-dev" # 运行时依赖:确保目标板有运行所需的libmodbus库 RDEPENDS_${PN} += "libmodbus" S = "${WORKDIR}" do_compile() { ${CC} ${CFLAGS} ${LDFLAGS} test.c -o test -lmodbus } do_install() { install -d ${D}/opt/modbustest/bin install -m 0755 test ${D}/opt/modbustest/bin } # 指定程序的安装路径 FILES_${PN} += "/opt/modbustest/bin/test"
最终验证说明
最终通过在目标板安装libmodbus-dev替代原有的libmodbus,并结合上述Recipe修改,成功完成编译。需注意:
libmodbus:仅包含运行时共享库,用于程序运行阶段libmodbus-dev:包含编译所需的头文件、静态库及pkg-config配置,是编译依赖libmodbus的程序必须的包
内容的提问来源于stack exchange,提问作者marco94
相关产品推荐
相关产品推荐

