欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

新手入门makefile教程

程序员文章站 2022-07-02 09:47:12
...

定义

我们在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 [email protected]
# [email protected]:规则中的目标
# $<:规则中的第一个依赖
# $^:规则中的所有依赖
# 上述符号只能在命令中使用

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

第四版

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 [email protected]

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

第五版

添加清理项目的规则

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 [email protected]
.PHONY:clean  #声明伪目标,防止受当前目录已存在clean的影响
clean:
	rm $(obj) $(target) -f  #-f表示强制执行

makefile的使用

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