致命错误: avr/io.h: 没有这样的文件或目录

fatal error: avr/io.h: No such file or directory

本文关键字:文件 avr io 致命错误      更新时间:2023-10-16

我正在使用avr-gcc和avrdude通过RPi3对ATMEGA328进行编程。我想使用 C++ 而不是 C,所以我创建了一个简单的 C++ 文件并尝试构建它:

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
void delayms( uint16_t millis ) 
{
    while ( millis ) 
    {
        _delay_ms( 1 );
        millis--;
    }
}
int main() 
{
    DDRD = 0xFF;
    while( 1 )
    {
        PORTD = 0xFF;
        delayms( 1000 );
        PORTD = 0x00;
        delayms( 1000 );
    }
    return 0;
}

我的制作文件:

CC=/usr/bin/avr-gcc
MEGA=328p
CFLAGS=-g -Os -Wall -mcall-prologues -mmcu=atmega$(MEGA)
OBJ2HEX=/usr/bin/avr-objcopy
PROG=/usr/local/bin/avrdude
SOURCE=$(SOURCE)
DEVICE=$(DEVICE)
program : $(SOURCE).hex
        $(PROG) -c linuxgpio -p m$(MEGA) -P $(DEVICE) -e -B 2.0 -U lfuse:w:0xe2:m -U hfuse:w:0xd9:m
        $(PROG) -c linuxgpio -p m$(MEGA) -P $(DEVICE) -U flash:w:$(SOURCE).hex
%.obj : %.o
        $(CC) $(CFLAGS) $< -o $@
%.hex : %.obj
        $(OBJ2HEX) -R .eeprom -O ihex $< $@
clean :
        rm -f *.hex *.obj *.o

我按以下方式构建它:

sudo make DEVICE=atmega328p SOURCE=blink

问题是,如果我将文件保存为 blink.c,它将正确构建,但如果我将其保存为 blink.cpp,它会调用 g++ 编译器,而不是 avr-g++,所以我将 Makefile 中的第一行更新为:

CC=/usr/bin/avr-g++

但是同样的问题仍然存在,我不断收到以下错误:

g++    -c -o blink.o blink.cpp
blink.cpp:3:20: fatal error: avr/io.h: No such file or directory
 #include <avr/io.h>
                    ^
compilation terminated.
<builtin>: recipe for target 'blink.o' failed
make: *** [blink.o] Error 1

如果我手动运行以下命令,它可以很好地构建:

avr-g++    -c -o blink.o blink.cpp

我不明白为什么当我运行 Makefile 时它会尝试运行 g++ 而不是 avr-g++,即使我严格指定了 avr-g++有什么建议吗?谢谢!

从 GNU 制作文档:

编译C++程序

n.o 由 n.cc、n.cpp 或 n.C 自动制成,配方形式为"$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c"。

尝试设置变量 CXX 而不是 CC。