新手入门makefile教程

为什么使用makefile

我们在linux下进行编程时,通常使用的是gcc编译器,这种情况下我们通常要去手写编译命令,如:gcc a.c b.c -o app。这虽然看上去很简单,但在实际开发中,往往需要编译的文件有很多,甚至还要去链接一些动态库等等,我们不可能每次都去写一长串的命令。为了方便管理,makefile就诞生了,它可以使用一些简单的规则,来帮助我们构建编译命令,十分方便。

makefile中的规则

以 gcc a.c b.c -o app为例,将其写成规则,分为三个部分:目标、依赖和命令。下面是五个版本的makefile写法。

第一版

app:a.c b.c  #app是目标,a.c和b.c是依赖
	gcc a.c b.c -o app

上述写法效率太低,修改一个文件,其他文件也需修改。

第二版

app:a.o b.o
	gcc a.o b.o -o app
a.o:a.c
	gcc a.c
b.o:b.c
	gcc b.c

只修改一个源文件如a.c,则make只执行gcc a.c和gcc a.o b.o -o app两条命令,不再执行gcc b.c。

第三版

obj=a.o b.o #声明变量
target=app #声明变量
$(target):$(obj) #$用于变量取值
	gcc $(obj) -o $(target)	
%.o:%.c
	gcc -c $< -o $@
# $@:规则中的目标
# $<:规则中的第一个依赖
# $^:规则中的所有依赖
# 上述符号只能在命令中使用

上述写法的可移植性依然很差。

第四版

src=$(wildcard ./*.c) #查找指定目录下的.c文件
obj=$(patsubst %.c, %.o, $(src)) #匹配替换,如将src中的a.c替换成a.o,b.c替换成b.o
target=app
$(target):$(obj)
	gcc $(obj) -o $(target)
%.o:%.c
	gcc -c $< -o $@

上述写法的缺点是不能自动清理项目。

第五版

添加清理项目的规则

src=$(wildcard ./*.c) #查找指定目录下的.c文件
obj=$(patsubst %.c, %.o, $(src)) #匹配替换,如将src中的a.c替换成a.o,b.c替换成b.o
target=app
$(target):$(obj)
	gcc $(obj) -o $(target)
%.o:%.c
	gcc -c $< -o $@
.PHONY:clean  #声明伪目标,防止受当前目录已存在clean的影响
clean:
	rm $(obj) $(target) -f  #-f表示强制执行

makefile的使用

在工作目录下创建并编写好makefile文件后,在终端输入make(确保make已经安装)即可生成目标文件以及最终的可执行程序。然后输入make clean(如果写了该规则)可以清理生成的中间文件和可执行程序。

你可能感兴趣的:(生产工具,makefile,gcc)