我有一个不断抛出错误的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
答案 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在这里也有些相关。)