makefile——编译所有.c文件为可执行文件

时间:2022-03-04 12:47:57

当前目录下有多个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这个目标。