首页 > 解决方案 > 致命错误:avr/io.h:没有这样的文件或目录

问题描述

我正在使用 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++。请问有什么建议吗?谢谢!

标签: c++gcc

解决方案


来自GNU make 文档

编译 C++ 程序

no 是从 n.cc、n.cpp 或 nC 自动生成的,其配方格式为“$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c”。

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


推荐阅读