Makefile 将多个源构建到目录中的多个目标中

Makefile 将多个源构建到目录中的多个目标中,makefile,gnu-make,Makefile,Gnu Make,伙计们。我正在学习GNU Make,我有以下项目结构: ~/projects /sysCalls ex1.c ex2.c ex3.c ex4.c ex5.c ex6.c ex7.c 每个.c源代码都非常简单,都有自己的主函数,并且必须内置到相应的二进制文件中(最好以其源代码命名)。但是我想建立一个bin目录(添加到我的.gitignore文件中) 我当前的Makefile是:

伙计们。我正在学习GNU Make,我有以下项目结构:

~/projects
    /sysCalls
        ex1.c
        ex2.c
        ex3.c
        ex4.c
        ex5.c
        ex6.c
        ex7.c
每个
.c
源代码都非常简单,都有自己的
函数,并且必须内置到相应的二进制文件中(最好以其源代码命名)。但是我想建立一个
bin
目录(添加到我的
.gitignore
文件中)

我当前的Makefile是:

CC := gcc
CFLAGS := -Wall -g
SRC := $(wildcard *.c)
TARGET := $(SRC:.c=)

all: bin $(TARGET)
    mv $(TARGET) bin/

bin:
    mkdir bin

clean:
    rm -fr bin/
它按预期工作,但总是构建每个源。我不喜欢“手动”将所有东西移动到
垃圾箱


关于如何改进此Makefile的任何提示或想法?

目标行替换为

TARGET := $(addprefix bin/,$(SRC:.c=))
和添加(使用适当的编译/链接规则)

make
仍将生成任何非最新的二进制文件,
make bin/ex1
将直接在
bin
目录中生成单个二进制文件

面对
-j
参数,
all
目标上的操作顺序不可靠


对于GNU来说,这就是我们的目的。

多亏了Etan Reisner的回答,我找到了我认为是解决方案的东西

CC := gcc
CFLAGS := -Wall -g
SRC := $(wildcard *.c)
TARGET := $(SRC:%.c=bin/%)

all: | bin $(TARGET)

bin/% : %.c
    $(CC) $(CFLAGS) $< -o $@

bin:
    mkdir bin

clean:
    rm -fr bin/
CC:=gcc
CFLAGS:=-Wall-g
SRC:=$(通配符*.c)
目标:=$(SRC:%.c=bin/%)
全部:| bin$(目标)
bin/%:%
$(CC)$(CFLAGS)$<-o$@
箱子:
mkdir-bin
清洁:
rm-fr箱/

关键是使用
bin/%:%.c
规则。

谢谢!你的回答让我找到了正确的方向。但是,将/bin附加到目标只适用于第一项。我不得不使用$(addprefix…)函数。
$(addprefix bin/,$(SRC:.c=)
可以替换为
$(SRC:%.c=bin/%)
。仅在
$(TARGET)
上下订单可能不是您真正想要的(尽管对于像
all
这样的目标来说可能没有多大区别)。您的
bin/%
规则在
$
CC := gcc
CFLAGS := -Wall -g
SRC := $(wildcard *.c)
TARGET := $(SRC:%.c=bin/%)

all: | bin $(TARGET)

bin/% : %.c
    $(CC) $(CFLAGS) $< -o $@

bin:
    mkdir bin

clean:
    rm -fr bin/