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的所有子构建流程都使用正确的交叉编译工具。
额外检查项
- 验证Rust目标架构是否已安装:在构建环境中执行
rustup target list | grep aarch64-unknown-linux-gnu,确保目标已添加。 - 确认交叉编译器路径有效性:执行
which ${TARGET_SYS}-gcc,检查输出路径是否指向STAGING_BINDIR_CROSS下的编译器。 - 在
do_configure开头添加调试命令:echo "CC: $CC" && which ${TARGET_SYS}-gcc,验证环境变量是否正确加载。
内容的提问来源于stack exchange,提问作者raj123
相关产品推荐
相关产品推荐

