为什么使用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(如果写了该规则)可以清理生成的中间文件和可执行程序。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228307.html原文链接:https://javaforall.net
