首页 > 解决方案 > 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)/*

我知道这个问题与 . $(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

我错过了什么?

标签: cgccmakefile

解决方案


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

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

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

查看[GNU]: An Introduction to Makefiles了解更多详情。

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

@EDIT0

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


推荐阅读