c++ - 致命错误: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++。请问有什么建议吗?谢谢!
解决方案
来自GNU make 文档:
编译 C++ 程序
no 是从 n.cc、n.cpp 或 nC 自动生成的,其配方格式为“$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c”。
尝试设置变量 CXX 而不是 CC。
推荐阅读
- apache-flink - Flink - timesOrMore 的行为
- python - 如何从两个列表创建嵌套字典?
- c# - How to foreach through a list of datatables?
- arm - How to debug Bootloader Qemu ARM?
- dns - Stale/ghost TXT SPF records?
- angular - Angular 7:在 Json 请求中获取特定的子对象
- r - 计算直到第一次转向校正的时间
- javascript - 我们应该使用 v-model 来修改 Vuex 存储吗?
- python - Django appends white space to views
- git - Rebase branch B on top of branch A and have the end result be the exact same content as branch B