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),并且这有效,但我想弄清楚为什么这不起作用。

4

1 回答 1

0

可能会在链的某个地方丢失依赖项。

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

就像@MadScientist 建议的那样,“make -d”将成为您的朋友。使用它来定位应该找到但没有找到的规则/文件。

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

生成文件:

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

创建 main.cpp,看它工作,然后将 main.cpp 重命名为它找不到的其他名称,再次运行,看它失败。

现在重命名 Makefile 本身,看到同样的失败。

于 2021-10-20T15:22:01.700 回答