构建Yocto镜像时DirectFB2无法找到Fluxcomp-native的问题
树莓派0 W构建含DirectFB2的Yocto镜像问题解决方案
问题总结
- 构建依赖Fluxcomp工具(仅用于构建阶段,无需包含在部署镜像中)
- 执行
bitbake fluxcomp-native时报错:install: cannot stat 'build/tmp/work/x86_64-linux/fluxcomp-native/1.0+gitAUTOINC+10ad2ebc78-r0/build/fluxcomp-native': No such file or directory,实际目录仅存在fluxcomp二进制文件 - 生成的工具被命名为
fluxcomp-native而非期望的fluxcomp,且bitbake build-sysroots不再将其部署到build/tmp/sysroots/x86_64/usr/bin - 执行
bitbake directfb2时触发与fluxcomp-native构建相同的错误
核心修复:修改fluxcomp.bb配方
1. 修正安装逻辑中的文件名引用
原生配方使用${PN}作为安装文件名,在native构建时${PN}会被替换为fluxcomp-native,但实际编译生成的二进制是fluxcomp,直接指定文件名即可解决找不到文件的问题:
do_install() { echo "DO_INSTALL FLUXCOMP TO ${D}${bindir}" install -d ${D}${bindir} # 直接使用编译生成的真实文件名fluxcomp,而非变量${PN} install -m 0755 ${B}/fluxcomp ${D}${bindir}/ # 如需统一命名为fluxcomp(包括native版本),可直接指定安装后的文件名 # install -m 0755 ${B}/fluxcomp ${D}${bindir}/fluxcomp }
2. 简化Autotools配置流程
原do_configure中手动修改configure文件、指定交叉编译参数的方式易引发路径混乱,改用OE原生Autotools类处理,仅保留必要的autoreconf操作:
inherit autotools pkgconfig # 仅在configure.in存在时转换为configure.ac,并生成configure脚本 do_configure_prepend() { if [ -f ${S}/configure.in ]; then mv ${S}/configure.in ${S}/configure.ac fi cd ${S} autoreconf -i -f }
移除原自定义的do_configure函数,让OE自动处理交叉编译、前缀路径等配置。
3. 清理冗余编译逻辑
原do_compile中手动复制文件到${B}的操作完全多余,Autotools构建会自动在正确目录生成二进制文件,简化为:
do_compile() { cd ${S} make -j ${@oe.utils.cpu_count()} }
4. 明确Native版本的文件部署路径
添加Native版本的文件定义,确保工具被安装到OE指定的native staging目录,让directfb2能正常找到:
# 指定native版本的安装文件 FILES_${PN}-native = "${bindir}/fluxcomp"
辅助调整:修正directfb2.bb配方
1. 修正交叉编译架构
树莓派0 W为ARM架构,原cross-file指定--cpu=x86_64错误,需改为ARM架构参数:
do_configure() { export PATH="${STAGING_BINDIR_NATIVE}:${PATH}" # 适配树莓派0 W的ARM架构 meson env2mfile --cross -o ${WORKDIR}/my.meson.x86target.cross --cpu=arm --cpu-family=arm --system=linux meson ${EXTRA_OEMESON} ${S} ${B} }
2. 确保Fluxcomp在PATH中
在configure阶段将native工具目录加入环境变量PATH,避免meson找不到fluxcomp:
export PATH="${STAGING_BINDIR_NATIVE}:${PATH}"
内容的提问来源于stack exchange,提问作者Michael Thompson
相关产品推荐
相关产品推荐

