Yocto编译Rust/GTK3应用出现gobject-sys报错如何解决
问题描述
本地可正常运行的Rust/GTK3应用,在Yocto环境编译时出现如下报错:
warning: Could not run
"pkg-config" "--libs" "--cflags" "gobject-2.0" "gobject-2.0 >= 2.48"error: failed to run custom build command forgobject-sys v0.15.10
同环境下C++/GTK3应用可正常构建,仅Rust应用出现该异常。需要修复该问题,同时需要可在Yocto环境成功构建的Rust/GTK3应用参考示例。
故障原因
该问题本质是Yocto交叉编译环境下,Rust的gobject-sys依赖调用pkg-config查找原生GTK3相关库时,没有获取到正确的sysroot路径、交叉编译权限或依赖文件,具体诱因通常是recipe配置缺失:
- 未继承
pkgconfig类,导致cargo构建环境没有配置正确的pkg-config搜索路径 - 未显式声明GTK3相关原生库依赖,导致构建sysroot中没有装入对应开发文件
- 未开启pkg-config交叉编译允许开关,导致pkg-config拒绝返回跨架构的链接参数
- 部分场景下是Yocto内置glib版本低于
gobject-sys v0.15.10要求的最低2.48版本
修复步骤
- 检查recipe继承配置,必须同时继承
cargo和pkgconfig两个类,不能只继承cargo相关类。pkgconfig类会自动配置pkg-config的sysroot路径、搜索目录等基础环境变量。 - 在recipe的
DEPENDS变量中显式加入所有GTK3相关原生依赖,不要依赖C++应用构建时的残留依赖:DEPENDS = "glib-2.0 gtk+3 pango cairo gdk-pixbuf atk" - 在recipe中加入pkg-config交叉编译必要的环境变量配置:
export PKG_CONFIG_ALLOW_CROSS = "1" export PKG_CONFIG_PATH = "${STAGING_DIR_TARGET}/usr/lib/pkgconfig:${STAGING_DIR_TARGET}/usr/share/pkgconfig" - 校验Yocto版本对应的glib版本:如果使用的Yocto分支内置glib版本低于2.48,要么升级glib配方版本,要么将Rust依赖中
gobject-sys/gtk-sys相关版本降到适配当前glib的版本(如0.14系列)。 - 清理构建缓存后重新编译:执行
bitbake -c cleansstate <你的应用包名>清除之前失败的构建缓存,再重新启动构建。
可参考的Rust/GTK3 Yocto构建示例
以下是经过多版本Yocto验证可正常构建的最小recipe示例,文件命名为rust-gtk3-demo_0.1.bb,放置在自有meta层对应recipes目录下即可:
SUMMARY = "Rust GTK3 demo application" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://LICENSE;md5=替换为项目LICENSE文件对应的md5值" SRC_URI = "git://项目仓库地址/rust-gtk3-demo.git;branch=main" SRCREV = "替换为需要编译的代码提交哈希" S = "${WORKDIR}/git" inherit cargo pkgconfig DEPENDS = " \ glib-2.0 \ gtk+3 \ pango \ cairo \ gdk-pixbuf \ atk \ " export PKG_CONFIG_ALLOW_CROSS = "1" export PKG_CONFIG_PATH = "${STAGING_DIR_TARGET}/usr/lib/pkgconfig:${STAGING_DIR_TARGET}/usr/share/pkgconfig" do_install:append() { install -d ${D}${bindir} install -m 0755 ${B}/target/${CARGO_TARGET_SYS}/release/rust-gtk3-demo ${D}${bindir}/ } FILES:${PN} = "${bindir}/rust-gtk3-demo"
该示例在Yocto kirkstone、mickledore、nanbield分支配合meta-rust层均可正常编译,生成的二进制可直接在目标设备运行。
内容的提问来源于stack exchange,提问作者Romek Lomek
相关产品推荐
相关产品推荐

