2017-01-23 64 views
0

我正在与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,所以我在这里...

+1

该命令甚至没有提到asm文件,如果失败了,它也会在没有asm规则的情况下失败。检查它为什么没有。 – Jester

+0

谷歌搜索这个,我发现“https://bugs.eclipse.org/bugs/show_bug.cgi?id=330249#c11” – Tommylee2k

+0

@Jester,是的,它没有ASM规则也失败了。但是当我在目录中使用没有asm文件的Makefile时,我尝试编译它,它会起作用。 – Nico

回答

0

好的是一个怪。

不得不删除/注释掉这两条线

... 
#CFLAGS+=-include 
... 
#CXXFLAGS+=-include 
... 

我忘了那些因为早期的方式编辑。

而且我编辑的ASM规则了一下:

%.o: %.S 
    $(CC) -mmcu=$(MMCU) -c -o [email protected] $< 

以下是完整的和纠正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 [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 [email protected] $< 

$(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 

感谢您的帮助

0

错误消息使得它非常清楚:

cc1: error: to generate dependencies you must specify either -M or -MM 

编译器要你给它的标志之一。您目前没有给出这些标志,正如我们可以从错误消息之前打印的命令中看到的那样。

为了解决这个问题,你可以在Makefile中添加其中的一个标志。有很多地方可以添加一个标志,但是对于这个标志,最有意义的是在任何有-MMD的地方后面添加标志。

或者,您可以通过删除-MMD选项完全禁用GCC依赖关系生成。您也可以查阅GCC documentation for these preprocessor options