编译错误-产生错误:***多个目标模式.停止



我有一个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$@

最新更新