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

CMake中find_program无法找到其他Recipe提供的工具求助

解决方案

针对你遇到的问题,核心原因是组件A没有将toolA安装到Yocto构建体系的共享 staging 目录,导致组件B的sysroot无法访问到该工具。以下是两种场景下的规范实现方式:


场景1:B在配置目标机代码时需要查找目标机版本的toolA

(比如B生成的目标机程序依赖toolA,配置阶段需确认目标机环境存在该工具)

  1. 修改A.bb,将toolA同步到共享staging目录
    在A的安装阶段,除了将toolA安装到目标机镜像目录,还要复制到所有Recipe共享的目标机staging区域:

    do_install_append() {
        # 创建staging目录(确保路径存在)
        install -d ${STAGING_DIR_TARGET}${bindir}
        # 复制toolA到staging目录,供其他Recipe访问
        install -m 0755 ${D}${bindir}/toolA ${STAGING_DIR_TARGET}${bindir}/toolA
    }
    
  2. 配置B的CMake,指定目标机sysroot搜索路径
    在B.bb中添加CMake参数,让find_program优先搜索目标机的sysroot:

    EXTRA_OECMAKE += "-DCMAKE_FIND_ROOT_PATH=${STAGING_DIR_TARGET}"
    
  3. 保留依赖顺序配置
    你已添加的依赖语句可以保留,确保A的sysroot同步完成后再执行B的配置:

    do_configure[depends] += "A:do_populate_sysroot"
    

场景2:B在构建主机端需要运行主机版本的toolA

(比如toolA是构建辅助工具,用于生成代码、预处理文件等)

这种情况需要构建A的native版本(主机可执行的toolA):

  1. 创建A-native.bb配方
    复制A.bb为A-native.bb,适配native构建逻辑:

    inherit native cmake
    
    # 复用A.bb中的其他配置(如SRC_URI、S等)
    do_install_append() {
        # 将toolA安装到主机端的staging目录
        install -d ${STAGING_BINDIR_NATIVE}
        install -m 0755 ${D}${bindir}/toolA ${STAGING_BINDIR_NATIVE}/toolA
    }
    
  2. 修改B的依赖配置
    在B.bb中替换依赖为A-native:

    DEPENDS += "A-native"
    

    Yocto会自动将主机端staging目录加入构建环境的PATH,CMake的find_program可以直接找到toolA,无需额外配置搜索路径。

  3. 移除手动依赖语句
    由于DEPENDS已包含A-native,Yocto会自动处理构建顺序,无需保留do_configure[depends]。


临时方案的问题

你手动复制文件到共享目录的方式绕过了Yocto的staging/sstate缓存机制,会导致:

  • 无法利用构建缓存,重复构建效率低下
  • 路径依赖强,跨构建环境容易出错
  • 不符合Yocto构建规范,后续维护成本高

内容的提问来源于stack exchange,提问作者Tomek The Messenger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:00:17