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

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

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值