当前目录下有多个C文件,每个C文件有一个main函数,把这些C文件分别编译成对应名字的可执行文件。
注意不是把当前目录下所有C文件编译成一个可执行文件
CFLAGS = -g -Wall -Werror
LDFLAGS = -lpthread
src = $(wildcard *.c)
target = $(patsubst %.c, %, ${src})
.PHONY: all clean
%.o:%.c
$(CC) ${CFLAGS} -c -o $@
%:%.o
$(CC) ${LDFLAGS} -o $@
all: ${target}
clean:
rm -f ${target}
或者
CFLAGS = -g -Wall -Werror
LDFLAGS = -lpthread
src = $(wildcard *.c)
target = $(patsubst %.c, %, ${src})
.PHONY: all clean
%:%.c
$(CC) ${CFLAGS} ${LDFLAGS} $^ -o $@
all: ${target}
clean:
rm -f ${target}
注意下面的makefile是不正确的
CFLAGS = -g -Wall -Werror
LDFLAGS = -lpthread
src = $(wildcard *.c)
target = $(patsubst %.c, %, ${src})
.PHONY: all clean
target: ${src}
$(CC) ${CFLAGS} ${LDFLAGS} ${src} -o $@
clean:
rm -f ${target}
下面的也是不正确的
CFLAGS = -g -Wall -Werror
LDFLAGS = -lpthread
src = $(wildcard *.c)
target = $(patsubst %.c, %, ${src})
.PHONY: all clean
%:%.c
$(CC) ${CFLAGS} ${LDFLAGS} $^ -o $@
clean:
rm -f ${target}
虽然上面这个 Makefile不能使用命令
make
一次把所有.c生成相应的可执行文件,但是使用
make 某个.c文件名前面部分
是可以生成这个可执行文件的。
例如:
目录下存在test.c,使用上面的Makefile,用如下命令就可以生成test可执行文件:
make test
原因,没找到确切的解释,自己推测如下(如果有错请高手指点):
%:%.c 是一个模式规则,“%”的替换是在规则的其他变量和函数引用扩展完成之后进行的,变量和函数的展开一般发生在make读取Makefile时,而模式规则中的“%”则发生在make的执行过程。所以用make命令只能找到clean这个目标。