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

时间:2019-02-02 20:34:08

标签: c++ gcc

我正在使用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;
}

我的Makefile:

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 ,它将调用克++ 编译器,而不是<,强> AVR-克++ 下,所以我在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

即使我严格指定 avr-g ++,我也不知道为什么它在运行Makefile时会尝试运行 g ++ 而不是 avr-g ++ 。有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分:2)

来自GNU make documentation

  

编译C ++程序

     

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

尝试设置可变CXX代替CC的。