我正在使用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 ++ 。有什么建议吗?谢谢!
答案 0 :(得分:2)
编译C ++程序
n.o由n.cc,n.cpp或n.C自动制成,配方格式为“ $(CXX)$(CPPFLAGS)$(CXXFLAGS)-c”。
尝试设置可变CXX代替CC的。