我正在为AVR项目编写我的第一个Makefile并遇到了一些问题。第一次执行“make”但是吐出所有目标文件和main.map文件时,它会说“对'main'的未定义引用”。下次执行“make”时,它会完成编译,并且还会发出main.elf和main.hex文件。
正如我所提到的,我是新手,但有些东西告诉我这是一个链接问题。我搜索了类似的帖子,但没有找到任何解决方案,所以任何帮助表示赞赏。
我有一个项目文件夹,其中包含Makefile,在项目文件夹中有一个src文件夹,并且存在.c文件和.h所在的头文件夹。
以下是 Makefile :
SOURCE_FILES=$(wildcard src/*)
OBJECT_FILES=$(patsubst %.c,%.o,$(SOURCE_FILES))
INCLUDE_PATH=headers/
MCU=atmega328p
CFLAGS=-g -mmcu=$(MCU) -Wall -Wstrict-prototypes -Os -mcall-prologues
hex : elf
avr-size main.elf
avr-objcopy -R .eeprom -O ihex main.elf main.hex
elf : object
avr-gcc $(CFLAGS) -o main.elf -Wl,-Map,main.map $(wildcard *.o)
object : $(SOURCE_FILES)
avr-gcc $(CFLAGS) -Os -c $(SOURCE_FILES) -I$(INCLUDE_PATH)
load: main.hex
avrdude -c arduino -p m328p -P /dev/ttyACM0 -D -U flash:w:main.hex
clean:
rm *.o *.hex *.map *.elf
修改
第一次之后的输出:
avr-gcc -g -mmcu=atmega328p -Wall -Wstrict-prototypes -Os -mcall-prologues -o main.elf -Wl,-Map,main.map
/usr/lib/gcc/avr/4.8.2/../../../avr/lib/avr5/crtm328p.o: In function `__bad_interrupt':
../../../../crt1/gcrt1.S:195: undefined reference to `main'
collect2: error: ld returned 1 exit status
make: *** [elf] Error 1
秒之后的输出:
avr-gcc -g -mmcu=atmega328p -Wall -Wstrict-prototypes -Os -mcall-prologues -o main.elf -Wl,-Map,main.map Car.o main.o TinyTimber.o
avr-size main.elf
text data bss dec hex filename
7046 8 855 7909 1ee5 main.elf
avr-objcopy -R .eeprom -O ihex main.elf main.hex