【问题标题】:Make wildcard dependency No rule to make target needed by使通配符依赖没有规则使目标需要
【发布时间】:2013-11-06 21:58:44
【问题描述】:

我正在尝试使用通配符构建我的目标。这是我的 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),这可行,但我想弄清楚为什么这不起作用。

【问题讨论】:

  • 您必须运行make -d 并按照逻辑查看make 放弃隐式规则搜索的原因。很可能某些先决条件不被认为可以由 make 创建。但是,如果您将 % 更改为 $(BINARY) 并且它的工作原理很奇怪,因为我希望它会给您一个错误,即它无法构建某些文件或其他文件。
  • 是否设置了TOOLCHAIN_DIR$(TOOLCHAIN_DIR)/lib/libopencm3_stm32f4.a 存在吗? stm32f4-discovery.ld 是否存在于当前目录中?
  • @ComeRaczy,大家都同意。
  • 你有没有解决过这个问题?如果是这样:如何?!

标签: makefile


【解决方案1】:

可能在链的某个地方缺少依赖项。

注意:有些人忘记了“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 本身,看看同样的失败。

【讨论】:

    猜你喜欢
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    相关资源
    最近更新 更多