如何使用clang为avr(arduino)编译

如何使用clang为avr(arduino)编译,arduino,clang,avr,Arduino,Clang,Avr,当我搜索时,我发现7年前的搜索结果都在谈论叮当声,而不是叮当声本身 使用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.h

当我搜索时,我发现7年前的搜索结果都在谈论叮当声,而不是叮当声本身

使用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
我想用
clang++
替换第一步。我在这里做的改变

  • avr gcc到叮当声++
  • 添加了
    --target=avr
  • 添加了
    -nostlib
    ,因为我将自己包含它
  • 添加了
    -I/usr/avr/include/
    ,因为路径不是隐式的
  • 添加了
    -L/usr/avr/lib/avr6-lc-latmega2560
    ,因此它有足够的信息来构建elf
我在/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
< LVVM编译器中的AVR目标,其中CLAN是C和C++前端。要启用实验目标,必须从源代码编译LLVM。描述如何执行此操作


看看这本书,我发现有很好的理由证明它是实验性的。

我不确定最后该回答什么

用叮当声编译
.o
文件,并按照您的意愿手动链接所有内容,这可能不是最糟糕的主意


我不确定是否需要启用任何实验功能,因为我尝试将某些内容编译为AVR,并且在使用llvm存储库时,它与clang-12配合使用效果很好。

~~没有解决方法吗?我发现如果我在llvm中使用
-c
,并使用
avr gcc
链接它们,它似乎可以工作(没有执行代码,但编译/链接时没有错误)。~~从bug追踪器上看,它似乎无法生成正确的代码?@EricStotch,解决方法是什么?你认为它在没有支持的情况下为AVR生成了机器代码吗?正如我们在错误中看到的那样,链接是不正常的。但是当你手动链接的时候,它链接的很好。手动链接时,是否确定libc和libatmega2560相同?我有点困惑。我还注意到,当我从apt安装
gcc avr
avr libc
时,它们在没有直接指定它们的情况下工作得很好,但对于
atmega2560
@cppcp,我不确定有什么问题。我只知道如果我做了
-c
,并且链接到arv gcc,它不会抱怨,但我不知道代码是否完全不正确。我想在发出LLVM IR的arduino上使用非C语言,所以我希望以后可以运行代码。明白了。说到正确性,我不确定我是否能帮上忙:(我也喜欢玩LLVM,但可能你必须运行代码来猜测它是否工作正常:(你的Clang版本是否也会对
atmega2560
产生影响?一般来说,如果它能够正确运行-问题有点解决了?