如何使用clang编译器为avr(arduino)进行编译?

8
当我搜索时,我发现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

我希望用clang++替换第一步。我在这里做了以下更改:

  • avr-gcc 更改为 clang++
  • 添加--target=avr
  • 添加-nostdlib因为我将自己包含它
  • 添加-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/。因此,我得出了以下编译命令,并遇到了这些错误。我应该如何编译才能获得一个hex文件以上传到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

正如我们在错误中看到的那样,链接并不顺利。但是当您手动链接时,它可以正常链接。您确定在手动链接时libc和libatmega2560是相同的吗?我有点困惑。 - CPPCPPCPPCPPCPPCPPCPPCPPCPPCPP
我还注意到,当我从apt安装gcc-avravr-libc时,它们可以正常工作,而不需要直接指定它们,但是clang在处理atmega2560时会出现问题。 - CPPCPPCPPCPPCPPCPPCPPCPPCPPCPP
@CPPCPPCPPCPPCPPCPPCPPCPPCPPCPP 我其实什么都不确定。我只知道如果我使用-c并且与arv-gcc链接,它不会抱怨,但我不知道代码是否完全不正确。我想在Arduino上使用一种非C语言,该语言会发出LLVM IR,所以我希望稍后能够运行代码。 - Eric Stotch
了解。说到正确性,我不确定我能否帮忙 :( 我也喜欢玩LLVM,但是你可能需要运行代码来猜测它是否正常工作 :( 你的Clang版本对于 atmega2560也会出现问题吗? - CPPCPPCPPCPPCPPCPPCPPCPPCPPCPP
一般来说,如果程序能够正确运行,问题就基本解决了吧? - CPPCPPCPPCPPCPPCPPCPPCPPCPPCPP
显示剩余3条评论
2个回答

1

有没有什么解决方法?我发现如果我在llvm中使用-c并使用avr-gcc进行链接,似乎可以工作(尽管没有执行代码,但编译/链接没有错误)。从错误跟踪器中看来,它似乎只是不能生成正确的代码? - Eric Stotch
@EricStotch,解决方法是什么?你认为它会在不支持AVR的情况下生成机器代码吗? - Juraj

0

我不确定最终该怎么回答。

也许使用clang编译.o文件,然后像您希望的那样手动链接所有内容并不是最糟糕的想法。

我不确定是否需要启用任何实验功能,因为我尝试将一些东西编译到AVR上时,当我使用llvm存储库apt.llvm.org时,它可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接