我试图用avr-gnu编译器在代码块下编译arduino代码。我得到了这个错误:
avr-ld.exe unrecognized emulation mode: mcu=atmega328p.
Supported emulations:avr2 avr1 avr25 avr3 avr31 avr35 avr4 avr5 avr51 avr6 avrxmega1 avrxmega2 avrxmega3 avrxmega4 avrxmega5 avrxmega6 avrxmega7 avrtiny
字符串
我发现这个页面:https://gcc.gnu.org/onlinedocs/gcc/AVR-Options.html这表明它应该在avr 5 sim模式下链接,所以我添加了-mmcu= avr 5链接器选项.现在我得到:
avr-ld.exe unrecognized emulation mode: mcu=avr5
Supported emulations:avr2 avr1 avr25 avr3 avr31 avr35 avr4 avr5 avr51 avr6 avrxmega1 avrxmega2 avrxmega3 avrxmega4 avrxmega5 avrxmega6 avrxmega7 avrtiny
型
如果avr 5被支持,它是如何被识别的?o 0我尝试了几个不同的工具链从几个不同的年份,但似乎链接器不能正确解释这种模拟模式。较新的工具链支持328 p,但仍然不知何故不工作。我也尝试创建专用于Arduino的CodeBlocks项目,但不同的是,它传递-mmcu= atmega 328 p本身,仍然不能在这个或较新的工具链上工作。更新:我在这里完全错过了一些东西。我从Mingw将链接器更改为标准的x86 32 ld.exe并传递-mmcu= i386 pe,我得到了类似的错误:
ld.exe unrecognized emulation mode: mcu=i386pe
Supported emulations:i386pe
型
因此,这只会导致我缺乏对链接器仿真模式如何选择/配置的机制的理解。
1条答案
按热度按时间cxfofazt1#
几乎在任何情况下,你都不想手动调用链接器(
ld
或avr-ld
)!使用
avr-gcc
链接您的程序!请注意,
avr-gcc
本身并不是一个编译器,它只是一个驱动程序,根据命令行选项和命令行上提供的输入文件调用子程序,如编译器(cc1
用于C,cc1plus
用于C++,lto1
用于LTO编译的字节码),汇编器和链接器。avr-gcc
知道如何为相应的工具提供适当的命令行选项,如:仿真,库,包含和库的路径,启动代码,子选项等。为了查看
avr-gcc
调用了哪些工具,请添加-v
选项。字符串
你会看到类似这样的内容(avr-gcc v8.5.0):
型
collect2
只是 Package 对ld
的调用的其他工具。如果您想看到真实的东西,请使用avr-gcc ... -v -Wl,-v
。正确的Emulation
链接器的正确仿真是由位于编译器安装目录中
./lib/gcc/avr/$version
的设备特定规范文件device-specs/specs-atmega328p
确定的。规范“语言”是描述选项Map的一种方式;特别是负责将-mmcu=atmega328p
Map到正确仿真的位是型
self_spec
从命令行中删除-mmcu=*
,并设置ATmega 328 P的核心系列-mmcu=avr5
。然后,作为链接器调用的一部分,link_arch
将-mmcu=avr5
Map到要使用的链接器仿真-mavr5
。