【问题标题】:How do I use clang to compile for avr (arduino)如何使用 clang 编译 avr (arduino)
【发布时间】:2021-04-05 17:49:06
【问题描述】:

当我搜索时,我发现 7 年前的结果谈论的是一个 fork of 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,所以它有足够的信息来构建一个精灵

我在 /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

【问题讨论】:

  • 正如我们在错误中看到的,链接并不顺利。但是当您手动链接时,它会链接得很好。您确定手动链接时libc和libatmega2560相同吗?我有点困惑。
  • 我还注意到,当我从 apt 安装 gcc-avravr-libc 时,它们工作得很好,无需直接指定它们,但是对于 atmega2560,clang 吓坏了。
  • @CPPCPPCPPCPPCPPCPPCPPCPPCPPCPP 我不确定。我只知道我是否这样做-c 并与 arv-gcc 链接它不会抱怨,但我不知道代码是否完全不正确。我想在发出 LLVM IR 的 arduino 上使用非 C 语言,所以我希望以后可以运行代码。
  • 明白。说到正确性,我不确定我是否能提供帮助:(我也喜欢玩 LLVM,但可能你必须运行代码来猜测它是否正常工作:(你的 Clang 版本会不会吓到atmega2560也是?
  • 一般来说,如果它能够正常运行 - 问题就解决了吗?

标签: arduino clang avr


【解决方案1】:

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

看看the bug tracker,我发现它是实验性的有充分的理由。

【讨论】:

  • ~~没有变通办法吗?我想知道我是否在 llvm 中使用-c 并使用avr-gcc 链接它们似乎可以工作(没有执行代码,但它编译/链接没有错误)。~~ 从错误跟踪器看来,它只是没有产生正确的代码?
  • @EricStotch,解决方法是什么?你认为它为 AVR 生成机器代码而不支持它吗?
【解决方案2】:

我不知道最后该回答什么。

使用 clang 编译 .o 文件并按照您的意愿手动链接所有内容可能不是最糟糕的主意。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    相关资源
    最近更新 更多