我正在与Atmega8和Assembly玩Arround。 所以我来到了这样一个地步,它有一个Makefile,它通过文件夹查看,抓取每个* .S,* .c和* .cpp文件,链接并将它们编译为可执行的二进制文件。 我使用avr工具链和BootHID来刷新二进制文件,但我认为最后一个并不重要。Atmega8 - 使用一个Makefile编译并链接C和汇编文件
多数民众赞成我走到这一步:
CROSS ?=/home/nico/Dokumente/avr8-gnu-toolchain/bin/avr-
CC :=$(CROSS)gcc
CXX :=$(CROSS)g++
LD :=$(CROSS)g++
SIZE :=$(CROSS)size
OBJCOPY :=$(CROSS)objcopy
OBJDUMP :=$(CROSS)objdump
BOOTHID = /home/nico/Dokumente/bootloadHID/commandline/bootloadHID
RM=rm -f
TARGET=a
MMCU?=atmega8
AVRDUDE_FLAGS?=
SOURCES=$(wildcard *.cpp) $(wildcard *.c) $(wildcard *.S)
INCLUDES=
#SETTINGS=settings.h
OBJECTS = $(patsubst %.cpp,%.o,$(patsubst %.c,%.o,$(patsubst %.S,%.o,$(SOURCES))))
CSTD?=c99
COPT=-O2 -fdata-sections -ffunction-sections
CFLAGS=-mmcu=$(MMCU) -std=$(CSTD) $(COPT) -Wall
CFLAGS+=$(addprefix -I,$(INCLUDES))
CFLAGS+=-include
CXXSTD?=c++98
CXXOPT=$(COPT) -fno-exceptions -fno-rtti
CXXFLAGS=-mmcu=$(MMCU) -std=$(CXXSTD) $(CXXOPT) -Wall
CXXFLAGS+=$(addprefix -I,$(INCLUDES))
CXXFLAGS+=-include
LDFLAGS=-mmcu=$(MMCU) -Wl,--gc-sections -Wl,-Map=$(TARGET).map,--cref
.PHONY: all avrdude flash
all: $(TARGET).hex $(TARGET).lst
$(TARGET).elf: $(OBJECTS)
$
$(LD) $(LDFLAGS) $^ -lm -o [email protected]
$(TARGET).hex: $(TARGET).elf
$(OBJCOPY) -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< [email protected]
$(TARGET).bin: $(TARGET).elf
$(OBJCOPY) -O binary -R .eeprom -R .fuse -R .lock -R .signature $< [email protected]
%.o: %.cpp
$(CXX) -o [email protected] $(CXXFLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -c
%.o: %.c
$(CC) -o [email protected] $(CFLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -c
%.o: %.S
$(CC) -mmcu=$(MMCU) -c -o timing.o timing.S
$(TARGET).lst: $(TARGET).elf
$(OBJDUMP) -h -S $< > [email protected]
avrdude: $(TARGET).hex
avrdude $(AVRDUDE_FLAGS) -e -m flash -i $<
flash: $(TARGET).hex
$(BOOTHID) $<
clean:
$(RM) $(OBJECTS) *.elf *.hex *.lst *.map *.d
如果我没有它就像一个魅力夹中的所有* .S-文件。
这条线硬编码只是为了调试。
%.o: %.S
$(CC) -mmcu=$(MMCU) -c -o timing.o timing.S
但只要我把我的Assemblyfile在目录的C一起-文件,我得到这个错误:
$ make
/home/nico/Dokumente/avr8-gnu-toolchain/bin/avr-gcc -o lcd.o -mmcu=atmega8 -std=c99 -O2 -fdata-sections -ffunction-sections -Wall -include -MMD -MP -MF lcd.d lcd.c -c
cc1: error: to generate dependencies you must specify either -M or -MM
这是一种群体项目我的工作。当我的组伙伴通过Visual Studio编译代码时,一切都很好,所以我认为代码应该没问题。 但我使用Linux,所以我在这里...
该命令甚至没有提到asm文件,如果失败了,它也会在没有asm规则的情况下失败。检查它为什么没有。 – Jester
谷歌搜索这个,我发现“https://bugs.eclipse.org/bugs/show_bug.cgi?id=330249#c11” – Tommylee2k
@Jester,是的,它没有ASM规则也失败了。但是当我在目录中使用没有asm文件的Makefile时,我尝试编译它,它会起作用。 – Nico