没有规则来制作目标'startup.s'

时间:2015-11-02 20:49:35

标签: makefile

我有一个不断抛出错误的Makefile:

make: *** No rule to make target 'startup.s', needed by 'all'. Stop.

我创建了一些变量:

OUT_DIR = ./Build

SOURCE_DIR = ./Src

SOURCES  = main.c
SOURCES += startup.s

OBJECTS  = $(SOURCES:.c=.o)
OBJECTS += $(SOURCES:.s=.o)

这是我的目标:

all: setup $(OBJECTS)
    @echo "Done!" 

setup:
    @mkdir -p $(OUT_DIR)

%.o : $(SOURCE_DIR)/%.c
    @echo "Compiling $<"
    $(CC) $(CFLAGS) $< -o $(OUT_DIR)/$@
    @echo

%.o : $(SOURCE_DIR)/%.s
    @echo "Compiling $<"
    $(CC) $(CFLAGS) $< -o $(OUT_DIR)/$@
    @echo

为什么不找到startup.s的目标,它应该使用最后一个目标%.o : $(SOURCE_DIR)/%.s

1 个答案:

答案 0 :(得分:2)

您没有startup.s的目标。您有一个使用 .s文件的目标(来自$(SOURCE_DIR)目录)。

startup.s应该是一个已经存在的文件,可以将编译成相应的.o文件。

您的$(OBJECTS)变量并不包含您的认为。

认为它包含main.o startup.o但它没有。 实际包含main.o startup.s main.c startup.o。 (每个替换引用仅更改匹配的值。它直接传递不匹配的值。)

您需要为这些行添加$(filter)来执行您想要的操作。

这就是问题所在。您不小心告诉make在当前目录中构建startup.s文件,并且它不知道如何执行此操作。

作为此makefile的其他问题,您的%.o规则不会创建与目标模式匹配的文件,这会使make混淆。请参阅GNU Make维护者的Makefile规则的Rule 2。 (规则3在这里也有些相关。)