Atmega8 - 使用一个 Makefile 编译和 link C 和汇编文件
Atmega8 - Compile and link C and Assembly-files with one Makefile
我正在玩 Atmega8 和 Assembly。
所以我想到了如果有一个 Makefile 会很好,它会查看文件夹,抓取每个 *.S、*.c 和 *.cpp 文件,link 并将它们编译成可闪存的二进制文件。
我正在使用 avr-toolchain 和 BootHID 来刷新二进制文件,但我认为最后一个无关紧要。
这就是我到目前为止所得到的:
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 $@
$(TARGET).hex: $(TARGET).elf
$(OBJCOPY) -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@
$(TARGET).bin: $(TARGET).elf
$(OBJCOPY) -O binary -R .eeprom -R .fuse -R .lock -R .signature $< $@
%.o: %.cpp
$(CXX) -o $@ $(CXXFLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -c
%.o: %.c
$(CC) -o $@ $(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 $< > $@
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,所以我在这里...
错误消息非常清楚:
cc1: error: to generate dependencies you must specify either -M or -MM
编译器希望您给它其中一个标志。你目前没有给它任何一个标志,正如我们从错误消息之前打印的命令中看到的那样。
要解决这个问题,您可以将这些标志之一添加到您的 Makefile 中。您可以在很多地方添加标志,但对于这个标志,最合理的做法是在您拥有 -MMD
.
的任何位置之后立即添加它
或者,您可以通过删除 -MMD
选项来完全禁用 GCC 依赖项生成。
不得不delete/comment出这两行
...
#CFLAGS+=-include
...
#CXXFLAGS+=-include
...
我忘记了那些,因为编辑的时间太早了。
并且我对 asm 规则进行了一些编辑:
%.o: %.S
$(CC) -mmcu=$(MMCU) -c -o $@ $<
如果有一天有人需要的话,这里是完整且更正的 Makefile:
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=
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))
CXXSTD?=c++98
CXXOPT=$(COPT) -fno-exceptions -fno-rtti
CXXFLAGS=-mmcu=$(MMCU) -std=$(CXXSTD) $(CXXOPT) -Wall
CXXFLAGS+=$(addprefix -I,$(INCLUDES))
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 $@
$(TARGET).hex: $(TARGET).elf
$(OBJCOPY) -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@
$(TARGET).bin: $(TARGET).elf
$(OBJCOPY) -O binary -R .eeprom -R .fuse -R .lock -R .signature $< $@
%.o: %.cpp
$(CXX) -o $@ $(CXXFLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -c
%.o: %.c
$(CC) -o $@ $(CFLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -c
%.o: %.S
$(CC) -mmcu=$(MMCU) -c -o $@ $<
$(TARGET).lst: $(TARGET).elf
$(OBJDUMP) -h -S $< > $@
avrdude: $(TARGET).hex
avrdude $(AVRDUDE_FLAGS) -e -m flash -i $<
flash: $(TARGET).hex
$(BOOTHID) $<
clean:
$(RM) $(OBJECTS) *.elf *.hex *.lst *.map *.d
感谢您的帮助
我正在玩 Atmega8 和 Assembly。 所以我想到了如果有一个 Makefile 会很好,它会查看文件夹,抓取每个 *.S、*.c 和 *.cpp 文件,link 并将它们编译成可闪存的二进制文件。 我正在使用 avr-toolchain 和 BootHID 来刷新二进制文件,但我认为最后一个无关紧要。
这就是我到目前为止所得到的:
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 $@
$(TARGET).hex: $(TARGET).elf
$(OBJCOPY) -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@
$(TARGET).bin: $(TARGET).elf
$(OBJCOPY) -O binary -R .eeprom -R .fuse -R .lock -R .signature $< $@
%.o: %.cpp
$(CXX) -o $@ $(CXXFLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -c
%.o: %.c
$(CC) -o $@ $(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 $< > $@
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,所以我在这里...
错误消息非常清楚:
cc1: error: to generate dependencies you must specify either -M or -MM
编译器希望您给它其中一个标志。你目前没有给它任何一个标志,正如我们从错误消息之前打印的命令中看到的那样。
要解决这个问题,您可以将这些标志之一添加到您的 Makefile 中。您可以在很多地方添加标志,但对于这个标志,最合理的做法是在您拥有 -MMD
.
或者,您可以通过删除 -MMD
选项来完全禁用 GCC 依赖项生成。
不得不delete/comment出这两行
...
#CFLAGS+=-include
...
#CXXFLAGS+=-include
...
我忘记了那些,因为编辑的时间太早了。
并且我对 asm 规则进行了一些编辑:
%.o: %.S
$(CC) -mmcu=$(MMCU) -c -o $@ $<
如果有一天有人需要的话,这里是完整且更正的 Makefile:
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=
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))
CXXSTD?=c++98
CXXOPT=$(COPT) -fno-exceptions -fno-rtti
CXXFLAGS=-mmcu=$(MMCU) -std=$(CXXSTD) $(CXXOPT) -Wall
CXXFLAGS+=$(addprefix -I,$(INCLUDES))
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 $@
$(TARGET).hex: $(TARGET).elf
$(OBJCOPY) -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@
$(TARGET).bin: $(TARGET).elf
$(OBJCOPY) -O binary -R .eeprom -R .fuse -R .lock -R .signature $< $@
%.o: %.cpp
$(CXX) -o $@ $(CXXFLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -c
%.o: %.c
$(CC) -o $@ $(CFLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -c
%.o: %.S
$(CC) -mmcu=$(MMCU) -c -o $@ $<
$(TARGET).lst: $(TARGET).elf
$(OBJDUMP) -h -S $< > $@
avrdude: $(TARGET).hex
avrdude $(AVRDUDE_FLAGS) -e -m flash -i $<
flash: $(TARGET).hex
$(BOOTHID) $<
clean:
$(RM) $(OBJECTS) *.elf *.hex *.lst *.map *.d
感谢您的帮助