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

Yocto构建zenoh-c库时遇rustc链接器‘cc未找到’错误求助

解决Yocto构建zenoh-c时的linker 'cc' not found错误

问题分析

该错误源于Cargo构建过程中未正确获取交叉链接器配置,即使手动设置了RUSTFLAGS和链接器路径,仍可能因为环境变量未被子进程继承、cmake参数传递不完整或未使用Yocto cargo类的标准配置导致失效。

解决方案

1. 使用Yocto Cargo类的标准配置变量

替换手动export环境变量的方式,改用Yocto cargo类提供的全局变量,确保Cargo自动读取交叉编译配置:

2. 修改后的配方文件

SUMMARY = "Zenoh C Library"
DESCRIPTION = "A C implementation of the Zenoh protocol."
HOMEPAGE = "https://github.com/eclipse-zenoh/zenoh-c"
LICENSE = "EPL-2.0 & Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=530d837aca648e45704db71dedff39c4"

SRC_URI = "git://github.com/eclipse-zenoh/zenoh-c.git;branch=main;protocol=https"
SRCREV = "af53af345cf7263b13954b4553b654c1d9c5cfb5"

PV = "1.0+git${SRCPV}"
S = "${WORKDIR}/git"

DEPENDS += "cmake ninja rust-bin-cross-aarch64"

inherit cmake pkgconfig cargo

# 全局配置Cargo交叉编译目标与链接器
CARGO_BUILD_TARGET = "aarch64-unknown-linux-gnu"
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER = "${TARGET_SYS}-gcc"
RUSTFLAGS += "-Clinker=${TARGET_SYS}-gcc -Car=${TARGET_SYS}-ar"

# 全局设置交叉工具链环境变量,确保所有构建步骤继承
export CC="${TARGET_SYS}-gcc"
export CXX="${TARGET_SYS}-g++"
export AR="${TARGET_SYS}-ar"

do_configure() {
    cmake ${S} \
        -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_SYSROOT="${STAGING_DIR_TARGET}" \
        -DCMAKE_C_COMPILER="${TARGET_SYS}-gcc" \
        -DCMAKE_CXX_COMPILER="${TARGET_SYS}-g++" \
        -DZENOHC_CUSTOM_TARGET=${CARGO_BUILD_TARGET} \
        -DZENOHC_CARGO_FLAGS="--target ${CARGO_BUILD_TARGET}"
}

do_install() {
    install -d ${D}${libdir}
    install -d ${D}${includedir}

    # 安装库文件
    cp -r ${B}/target/${CARGO_BUILD_TARGET}/release/*.so* ${D}${libdir}/

    # 安装头文件
    cp -r ${S}/include/zenoh ${D}${includedir}/
}

FILES_${PN} = "${libdir}/* ${includedir}/zenoh/*"

3. 关键修改点说明

  • 改用Yocto标准变量:CARGO_TARGET_*_LINKER和RUSTFLAGS作为全局变量设置,Cargo会自动读取这些配置,避免子进程环境变量丢失的问题。
  • 使用${TARGET_SYS}-gcc而非绝对路径:Yocto会自动解析到正确的交叉编译器路径,避免硬编码路径带来的兼容性问题。
  • 全局导出工具链变量:确保cmake和Cargo的所有子构建流程都使用正确的交叉编译工具。

额外检查项

  1. 验证Rust目标架构是否已安装:在构建环境中执行rustup target list | grep aarch64-unknown-linux-gnu,确保目标已添加。
  2. 确认交叉编译器路径有效性:执行which ${TARGET_SYS}-gcc,检查输出路径是否指向STAGING_BINDIR_CROSS下的编译器。
  3. 在do_configure开头添加调试命令:echo "CC: $CC" && which ${TARGET_SYS}-gcc,验证环境变量是否正确加载。

内容的提问来源于stack exchange,提问作者raj123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:57:02