gcc - Makefile:添加依赖规则后目标“all”的配方失败

Kay*_*Kay 3 c gcc makefile

我有一个 Makefile 每次运行都会失败。我一直在更改一个 Makefile,该文件将一堆文件编译到一个需要创建的目录中(如果尚未创建)。all:失败了,老实说我不知道​​为什么会失败。

这是我的 Makefile 的样子:

CC=gcc
SRCDIR=src
INCDIR=include
BINDIR=../bin
CFLAGS = -flags
LIBS = -llibrary1 -llibrary2

all: 
    $(BINDIR) \
    $(BINDIR)/program1 \
    $(BINDIR)/program2 \
    $(BINDIR)/program3

$(BINDIR)/program1: $(SRCDIR)/program1.c | $(BINDIR)
    $(CC) $(CFLAGS) $< -o $@ $(LIBS)

$(BINDIR)/program2: $(SRCDIR)/program2.c | $(BINDIR)
    $(CC) $(CFLAGS) $< -o $@ $(LIBS)

$(BINDIR)/program3: $(SRCDIR)/program3.c | $(BINDIR)
    $(CC) $(CFLAGS) $< -o $@ $(LIBS)

$(BINDIR):
    mkdir -p $@

clean:
    rm -f $(BINDIR)/*
Run Code Online (Sandbox Code Playgroud)

我知道问题与 相关$(BINDIR),但我不知道该怎么办。我在 StackOverflow 上提出的最后一个问题给了我一些资源(例如这里的GNU 文档)。根据我的理解,$(BINDIR)当我运行 make 时应该首先制定,然后其他规则应该没有任何问题地执行。

这是我收到的错误,我知道这意味着$(BINDIR)在其余规则执行之前没有创建该错误。

user@user-Notebook:~/project/folder$ make
../bin \
    ../bin/program1 \
    ../bin/program2 \
    ../bin/program3
make: ../bin: Command not found
Makefile:16: recipe for target 'all' failed
make: *** [all] Error 127
Run Code Online (Sandbox Code Playgroud)

我缺少什么?

Cri*_*ati 5

将此作为答案发布,因为它不适合评论:

$(BINDIR) ( /program )更有意义,它依赖所有目标,而不是命令:

all: $(BINDIR) $(BINDIR)/program1 $(BINDIR)/program2 $(BINDIR)/program3
Run Code Online (Sandbox Code Playgroud)

查看[GNU]:Makefile 简介了解更多详细信息。

为了使Makefile更加紧凑,事情还可以更进一步(例如编写一个可以处理所有文件的模式规则)。

@编辑0

根据 @o11c 的评论,我删除了部分不正确的答案