如何使用 clang 编译 avr (arduino)

Eri*_*tch 8 avr arduino clang

当我搜索时,我发现 7 年前的结果谈论的是 clang 的叉子而不是 clang 本身。

使用 avr-gcc 我可以编译并上传我的代码

avr-gcc a.cpp -DF_CPU=16000000 -mmcu=atmega2560 -Wall -Werror -Wextra -Os
avr-objcopy -j .text -j .data -O ihex a.out my.hex
sudo avrdude -patmega2560 -cwiring -P/dev/ttyACM0 -b115200 -D -Uflash:w:my.hex:i
Run Code Online (Sandbox Code Playgroud)

我想用 替换第一步clang++。我在这里所做的更改

  • avr-gcc 到 clang++
  • 添加--target=avr
  • 添加是-nostdlib因为我会自己添加它
  • 添加是-I/usr/avr/include/因为路径不是隐式的
  • 已添加-L/usr/avr/lib/avr6 -lc -latmega2560,因此它有足够的信息来构建精灵

我在 /usr/lib/gcc/avr/10.2.0/device-specs/specs-atmega2560 找到了设备规格,其中提到crtatmega2560.o并且-latmega2560似乎位于/usr/avr/lib/avr6/. 所以我想出了以下内容并得到了这些错误。我应该如何编译才能使用 avrdude 获取十六进制上传?

$ clang++ a.cpp -DF_CPU=16000000 -mmcu=atmega2560 -Wall -Werror -Wextra -Os --target=avr -I/usr/avr/include/ -nostdlib -L/usr/avr/lib/avr6 -lc -latmega2560
/usr/bin/avr-ld: skipping incompatible /usr/avr/lib/avr6/libc.a when searching for -lc
/usr/bin/avr-ld: cannot find -lc
/usr/bin/avr-ld: skipping incompatible /usr/avr/lib/avr6/libatmega2560.a when searching for -latmega2560
/usr/bin/avr-ld: cannot find -latmega2560
Run Code Online (Sandbox Code Playgroud)

Jur*_*raj 1

AVR 目标在 LLVM 编译器中是实验性的,其中 clang 是 C 和 C++ 前端。要启用实验目标,您必须从源代码编译 LLVM。这个 Stack Overflow 答案描述了如何做到这一点。

看看错误跟踪器,我发现它是实验性的有充分的理由。