我有一个makefile的问题,它是存储库的一部分。我已经发布了这个问题,但不知道如何添加一些代码行之后,所以我在这里尝试。具有通用make规则的make文件存在一个问题。当我运行make,我得到以下错误:C:Mios32/include/makefile/commonMk:143: ***多个目标模式。停止。
下面是common的代码。Mk文件从第142行到144行:
# rule to create .elf file
$(PROJECT_OUT)/$(PROJECT).elf: $(ALL_OBJS)
@$(CC) $(CFLAGS) $(ALL_OBJS) $(LIBS) $(LDFLAGS) -o$@
我猜这是all_objs的问题,因为前面的这些行似乎可以工作:
# rule to create a .hex and .bin file
%.bin : $(PROJECT_OUT)/$(PROJECT).elf
@$(OBJCOPY) $< -O binary $@
%.hex : $(PROJECT_OUT)/$(PROJECT).elf
@$(OBJCOPY) $< -O ihex $@
# rule to create a listing file from .elf
%.lss: $(PROJECT_OUT)/$(PROJECT).elf
@$(OBJDUMP) -w -h -S -C $< > $@
# rule to create a symbol table from .elf
%.sym: $(PROJECT_OUT)/$(PROJECT).elf
@$(NM) -n $< > $@
下面是一些带有all_objs的附加行:
# list of all objects
ALL_OBJS = $(addprefix $(PROJECT_OUT)/, $(THUMB_OBJS) $(THUMB_CPP_OBJS) $(THUMB_AS_OBJS)
$(ARM_OBJS) $(ARM_CPP_OBJS) $(ARM_AS_OBJS))
# list of all dependency files
ALL_DFILES = $(ALL_OBJS:.o=.d)
这里有一些额外的行Project_out和project:
# where should the output files be located
PROJECT_OUT ?= $(PROJECT)_build
# default linker flags
LDFLAGS += -T $(LD_FILE) -mthumb -u _start -Wl,--gc-section -Xlinker -M -Xlinker -
Map=$(PROJECT_OUT)/$(PROJECT).map -nostartfiles -lstdc++
# default rule
all: dirs cleanhex $(PROJECT).hex $(PROJECT_OUT)/$(PROJECT).bin
$(PROJECT_OUT)/$(PROJECT).lss $(PROJECT_OUT)/$(PROJECT).sym projectinfo
# create the output directories
dirs:
@-if [ ! -e $(PROJECT_OUT) ]; then mkdir $(PROJECT_OUT); fi;
@-$(foreach DIR,$(DIRS), if [ ! -e $(PROJECT_OUT)/$(DIR) ];
then mkdir -p $(PROJECT_OUT)/$(DIR); fi; )
我对整个Make和Makefile主题都很陌生,所以我很难弄清楚这个问题。谢谢你的帮助。
你应该在你的问题中明确你在做什么操作系统。从上面的错误信息来看,您正在Windows上工作。你正在尝试使用的makefile是非常显然是针对UNIX系统,如GNU/Linux或MacOS。
如果您不熟悉Windows和UNIX之间的差异(这些差异是巨大而深刻的),那么在开始使用它之前,您肯定要学习很多东西。
要在Windows上使用UNIX环境,您需要使用WSL或Cygwin之类的东西,或者至少安装MinGW shell环境。当您这样做时,您需要使用UNIX路径,而不是Windows路径。Windows路径使用反斜杠(在UNIX中是转义序列)和驱动器号(在UNIX中没有等效的),特别是在makefile中,:
字符是特殊的,因此使用带有驱动器号的路径是一个问题。
您可以通过添加$(info ...)
函数来调试makefile,以显示变量的值:
# rule to create .elf file
$(info PROJECT_OUT = $(PROJECT_OUT))
$(info PROJECT = $(PROJECT))
$(info ALL_OBJS = $(ALL_OBJS))
$(PROJECT_OUT)/$(PROJECT).elf: $(ALL_OBJS)
@$(CC) $(CFLAGS) $(ALL_OBJS) $(LIBS) $(LDFLAGS) -o$@