Rust AVR目标构建时cc crate未调用avr-gcc报错如何解决?
问题原因
cc crate不会自动继承Rust交叉编译目标的工具链配置,默认会优先调用系统默认C编译器cc,因此无法识别AVR平台专属的头文件与编译参数。你看到的Cargo没有用avr-gcc的问题本质出在cc的工具链检测逻辑,和Cargo本身的目标识别无关。
解决步骤
- 显式指定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-atmega328build.rs中硬编码编译器配置,适合固定目标的项目- 显式指定AVR平台的C编译器
- 补全必要的AVR编译参数
你之前注释掉的-mmcu参数和关闭PIC的配置必须启用,否则编译出的目标文件无法匹配AVR平台链接要求。
- 补全必要的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
相关产品推荐
相关产品推荐

