首页 > > > 玩转Makefile | 一次编译多个目标
我是良许,世界500强外企 Linux 开发工程师,专业生产 Linux 干货,欢迎关注「良许Linux」,欢迎点赞、收藏!
1. 使用场景
本教程所介绍的Makefile不太适用于企业级项目,适用于我们平时练习时编写小代码而快速编译的场景。具体来讲,是这样的场景:
我们平时看书或教程时,里面讲到的一些案例我们想实操一下,这类的案例一般比较短小,经常一个.c文件就足矣。如果针对每个小程序都编写一个Makefile那就显得有些麻烦,或者不编写Makefile,那就要手动敲一串gcc编译命令,会影响学习效率。
于是我们就有这种需求:在一个文件夹下面有多个.c文件,分别对应一个小程序,而总共只有一个Makefile,只要一个make命令就可以把这些程序全部编译一遍。并且,再往里面增加小程序时,make一下也可以编译这个新增的程序。
本篇教程就是为了实现这个需求而编写的Makefile。
2. 编写思路
SOURCE = $(wildcard *.c)
TARGETS = $(patsubst %.c, %, $(SOURCE))gcc app1.c -o app1
gcc app2.c -o app2
gcc test.c -o test这样的命令可以抽象为一个,即:
$(TARGETS):%:%.c
$(CC) $< $(CFLAGS) -o $@TARGETS即为app1, app2, test,依赖为%:%c,这是一个模式变量,表示与目标相同的.c文件,即:
app1:app1.c
app2:app2.c
test:test.c有了这两个思路后,Makefile就可以补充完整了。完整的代码可以在公众号内回复mk2获取。
文件夹内容如下:

完整Makefile为:
SOURCE = $(wildcard *.c)
TARGETS = $(patsubst %.c, %, $(SOURCE))
CC = gcc
CFLAGS = -Wall -g
all:$(TARGETS)
$(TARGETS):%:%.c
$(CC) $< $(CFLAGS) -o $@
.PHONY:clean all
clean:
-rm -rf $(TARGETS)编译完成后文件夹内容为:

码字不易,欢迎点赞、收藏,让我更有动力生产更多 Linux 干货,多谢!
原文作者:;如有侵权,请联系管理员删除。