Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly Atmega8-使用一个Makefile编译并链接C和汇编文件_Assembly_Makefile_Embedded_Avr_Avr Gcc - Fatal编程技术网

Assembly Atmega8-使用一个Makefile编译并链接C和汇编文件

Assembly Atmega8-使用一个Makefile编译并链接C和汇编文件,assembly,makefile,embedded,avr,avr-gcc,Assembly,Makefile,Embedded,Avr,Avr Gcc,我在玩Atmega8和大会的游戏。 所以我想到了一点,有一个Makefile会很好,它会查看文件夹,抓取每个*.S、*.c和*.cpp文件,链接并编译成一个可闪存的二进制文件。 我使用avr工具链和BootHID来闪存二进制文件,但我认为最后一个并不重要 这就是我目前得到的: CROSS ?=/home/nico/Dokumente/avr8-gnu-toolchain/bin/avr- CC :=$(CROSS)gcc CXX :=$(CROSS)g++ LD

我在玩Atmega8和大会的游戏。 所以我想到了一点,有一个Makefile会很好,它会查看文件夹,抓取每个*.S、*.c和*.cpp文件,链接并编译成一个可闪存的二进制文件。 我使用avr工具链和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
但是,当我将Assemblyfile与c文件一起放入dir时,就会出现以下错误:

$ 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
这是我正在做的一个小组项目。当我的团队合作伙伴通过VisualStudio编译代码时,一切正常,因此我认为代码应该正常。
但是我使用的是linux,所以我在这里…

错误消息非常清楚:

cc1: error: to generate dependencies you must specify either -M or -MM
编译器希望您给它一个这样的标志。您当前没有给它这些标志中的任何一个,正如我们可以从错误消息之前打印的命令中看到的那样

要解决这个问题,您需要将这些标志之一添加到Makefile中。有很多地方可以添加一个标志,但对于这个地方来说,最有意义的是在您有
-MMD
的任何地方之后添加它

或者,您可以通过删除
-MMD
选项完全禁用GCC依赖项生成

您也可以咨询。

好的,这是一种责备

必须删除/注释掉这两行

...
#CFLAGS+=-include
...
#CXXFLAGS+=-include
...
我忘了这些,因为之前编辑的方式

我对asm规则做了一些修改:

%.o: %.S
    $(CC) -mmcu=$(MMCU) -c -o $@ $<
%.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
CROSS?=/home/nico/Dokumente/avr8 gnu工具链/bin/avr-
CC:=$(交叉)通用条款
CXX:=$(交叉)g++
LD:=$(交叉)g++
大小:=$(交叉)大小
对象复制:=$(交叉)对象复制
OBJDUMP:=$(交叉)OBJDUMP
BOOTHID=/home/nico/Dokumente/bootloadHID/commandline/bootloadHID
RM=RM-f
目标=a
MMCU?=atmega8
阿弗杜德旗=
源=$(通配符*.cpp)$(通配符*.c)$(通配符*.S)
包括=
OBJECTS=$(patsubst%.cpp,%.o,$(patsubst%.c,%.o,$(patsubst%.S,%.o,$(SOURCES)))
CSTD?=c99
COPT=-O2-fdata段-fffunction段
CFLAGS=-mmcu=$(mmcu)-std=$(CSTD)$(COPT)-墙壁
CFLAGS+=$(addprefix-I,$(包括))
CXXSTD?=c++98
CXXOPT=$(COPT)-fno异常-fno rtti
CXXFLAGS=-mmcu=$(mmcu)-std=$(CXXSTD)$(CXXOPT)-墙
CXXFLAGS+=$(addprefix-I,$(包括))
LDFLAGS=-mmcu=$(mmcu)-Wl,--gc sections-Wl,-Map=$(TARGET.Map,--cref
.假的:所有的阿弗杜德闪光
全部:$(目标).hex$(目标).lst
$(目标).elf:$(对象)
$(LD)$(LDFLAGS)$^-lm-o$@
$(目标).hex:$(目标).elf
$(OBJCOPY)-O ihex-R.eeprom-R.fuse-R.lock-R.signature$<$@
$(目标).bin:$(目标).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$@$<
$(目标).lst:$(目标).elf
$(OBJDUMP)-h-S$<>$@
平均值:$(目标).hex
avrdude$(avrdude_标志)-e-m闪存-i$<
闪存:$(目标).hex
$(BOOTHID)$<
清洁:
$(RM)$(对象)*.elf*.hex*.lst*.map*.d

感谢您的帮助

该命令甚至没有提到asm文件,如果失败,在没有asm规则的情况下也应该失败。检查为什么没有。谷歌搜索这个,我发现“@Jester,是的,没有asm规则它也会失败。但是当我在试图编译的目录中使用没有asm文件的Makefile时,它会工作。请确保没有名称冲突。不同行为的原因是使用通配符收集
对象
。没有名称冲突。有4个文件是dir:“lcd.c”,“lcd.h”,“main.c”和“timing.S”
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