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

Rust AVR目标构建时cc crate未调用avr-gcc报错如何解决?

问题原因

cc crate不会自动继承Rust交叉编译目标的工具链配置,默认会优先调用系统默认C编译器cc,因此无法识别AVR平台专属的头文件与编译参数。你看到的Cargo没有用avr-gcc的问题本质出在cc的工具链检测逻辑,和Cargo本身的目标识别无关。


解决步骤

    1. 显式指定AVR平台的C编译器
      三种可选配置方式,任选其一即可:
      方式一:全局配置到项目的.cargo/config.toml,一劳永逸
    [target.avr-unknown-gnu-atmega328]
    cc = "avr-gcc"
    
    方式二:编译时传递目标专属环境变量,适合临时调整场景
    AVR_UNKNOWN_GNU_ATMEGA328_CC=avr-gcc cargo build --target avr-unknown-gnu-atmega328
    
    方式三:直接在build.rs中硬编码编译器配置,适合固定目标的项目
    1. 补全必要的AVR编译参数
      你之前注释掉的-mmcu参数和关闭PIC的配置必须启用,否则编译出的目标文件无法匹配AVR平台链接要求。

修正后的build.rs参考:

fn main() {
    cc::Build::new()
        // 如果选了前两种编译器配置方式,可以删掉.compiler("avr-gcc")这行
        .compiler("avr-gcc")
        .flag("-mmcu=atmega328p")
        .pic(false) // 关闭PIC,AVR单片机不需要位置无关代码
        .file("src/rom.c")
        .compile("rom");
    // 如果C代码有额外头文件目录,可通过.include("目录路径")方法添加
}

完成上述配置后,cc会调用avr-gcc编译C代码,生成的静态库会自动被Cargo加入链接列表,之前的未定义符号错误也会一并解决。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:09:03