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

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 for gobject-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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.07 16:15:41