Makefile 没有制定目标的规则';startup.s';

Makefile 没有制定目标的规则';startup.s';,makefile,Makefile,我有一个Makefile不断抛出错误: make:**“all”不需要将目标设置为“startup.s”的规则。停止。 我创建了一些变量: OUT_DIR = ./Build SOURCE_DIR = ./Src SOURCES = main.c SOURCES += startup.s OBJECTS = $(SOURCES:.c=.o) OBJECTS += $(SOURCES:.s=.o) 以下是我的目标: all: setup $(OBJECTS) @echo "Do

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

make:**“all”不需要将目标设置为“startup.s”的规则。停止。

我创建了一些变量:

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
all:setup$(对象)
@回声“完成!”
设置:
@mkdir-p$(输出目录)
%.o:$(源目录)/%.c

@echo“编译$您没有用于
startup.s
的目标。您有一个使用
.s
文件的目标(来自
$(源目录)
目录)

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

您的
$(对象)
变量不包含您认为它的功能

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

您需要向这些行添加一个
$(过滤器)
调用,以执行您想要的操作

这就是问题所在。您无意中告诉make在当前目录中构建一个
startup.s
文件,而它不知道如何做到这一点


作为此makefile的附加问题,您的
%.o
规则不会创建与目标模式匹配的文件,这将混淆make。请参阅GNU make维护程序中的Makefiles规则。(规则3在此处也有点相关。)

这不是目标。%.o将是目标,make找不到与.s文件匹配的文件$(资料来源)/%.s将是依赖项。基本上,您需要为%.s制定规则files@DTSCode
.s
文件是源文件。它们无法生成。make将其视为目标这一事实本身就是问题所在。@EtanReisner对,这是因为他将其列为一个依赖项,而没有生成的方法building@DTSCode对,这就是问题。他根本不应该把它列为依赖项(在一个不是的地方)。他要么根本不应该明确地列出来(正如我在回答中指出的),要么从正确的位置列出来(这是
%.o:$(SOURCE_DIR)/%.s
目标已经做的)。啊!这就是问题所在,hanks@Etan