使通配符依赖项成为所需目标的规则不存在

4

我想使用通配符构建我的目标。以下是我的Makefile文件:

BINARY      = main
LDSCRIPT    = stm32f4-discovery.ld

PREFIX     ?= arm-none-eabi
CC          = $(PREFIX)-gcc
LD          = $(PREFIX)-gcc
OBJCOPY     = $(PREFIX)-objcopy

CFLAGS      += -Os -g \
       -Wall -Wextra -Wimplicit-function-declaration \
       -Wredundant-decls -Wmissing-prototypes -Wstrict-prototypes \
       -Wundef -Wshadow \
       -I$(TOOLCHAIN_DIR)/include \
       -fno-common -mcpu=cortex-m4 -mthumb \
       -mfloat-abi=hard -mfpu=fpv4-sp-d16 -MD -DSTM32F4
LDSCRIPT    ?= $(BINARY).ld
LDFLAGS     += --static -lc -lnosys -L$(TOOLCHAIN_DIR)/lib \
       -L$(TOOLCHAIN_DIR)/lib/stm32/f4 \
       -T$(LDSCRIPT) -nostartfiles -Wl,--gc-sections \
       -mthumb -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16
OBJS        += $(BINARY).o

all: images

images: $(BINARY).images

%.images: %.bin
    @#printf "*** $* images generated ***\n"

%.bin: %.elf
    @#printf "  OBJCOPY $(*).bin\n"
    $(Q)$(OBJCOPY) -Obinary $(*).elf $(*).bin

%.elf: $(OBJS) $(LDSCRIPT) $(TOOLCHAIN_DIR)/lib/libopencm3_stm32f4.a
    @#printf "  LD      $(subst $(shell pwd)/,,$(@))\n"
    $(Q)$(LD) -o $(*).elf $(OBJS) -lopencm3_stm32f4 $(LDFLAGS)

%.o: %.c Makefile
    @#printf "  CC      $(subst $(shell pwd)/,,$(@))\n"
    $(Q)$(CC) $(CFLAGS) -o $@ -c $<

clean:
    $(Q)rm -f *.o
    $(Q)rm -f *.d
    $(Q)rm -f *.elf
    $(Q)rm -f *.bin

-include $(OBJS:.o=.d)

当我进行制作时,出现错误:
make: *** No rule to make target `main.bin', needed by `main.images'.  Stop.

我正在尝试制作一张单一的图片,以便能够将每个%更改为$(BINARY)。这种方法是有效的,但我希望找出原因,为什么它无法正常工作。


3
你需要运行 make -d 并按照逻辑进行,以查看为什么 make 放弃隐式规则搜索。很可能是因为某个前置条件被 make 认为不能被创建。但是,如果你将 % 更改为 $(BINARY) 并且它可以正常工作,那么这很奇怪,因为我期望它会给你一个错误,指出无法构建某个文件。 - MadScientist
TOOLCHAIN_DIR 是否已设置?$(TOOLCHAIN_DIR)/lib/libopencm3_stm32f4.a 是否存在?当前目录中是否存在 stm32f4-discovery.ld - Come Raczy
@ComeRaczy,是的,全部同意。 - Yakubs
1
你解决了这个问题吗?如果是,怎么解决的? - Malin
1个回答

1

你可能在依赖链中漏掉了某个依赖。

注意:有些人会忘记,将“Makefile”本身放在依赖行上时,也会被检查是否存在。请仔细检查您是否重命名了它。

像@MadScientist建议的那样,“make -d”将是您的好帮手。使用它来定位应该被找到但未找到的规则/文件。

我简化了您的示例(在Linux上),并得到了相同类型的错误:

Makefile:

all: main.out
%.out: %.elf
   g++ $^ -o $@
%.elf: %.obj
   mv $^ $@
%.obj: %.cpp Makefile
   g++ -c $^ -o $@

创建main.cpp,看它是否可以运行,然后将main.cpp重命名为其他找不到的名称,再次运行,看它失败。
现在重命名Makefile本身,看到相同的失败。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接