一、Makefile简介
脚本用途: 把一系列命令的集合放在文件中批量执行。
Makefile可以理解为一个特殊的脚本文件;它的作用就是项目管理。
二、Makefile语法
- 书写语法
Makefile命名规则:
1) Makefile
2) makefile
Makefile内容语法:
ALL: #指定makefile的终极目标
clean -n: -rm -rf file1 # ,实际并不执行。 不加-n参数会直接执行clean后的命令。
#-n 参数列出要执行的命令
#-rm前的-的作用:删除不存在文件时,不报错。顺序执行结束。
1.一个规则
目标:依赖条件
(一个tab缩进)命令 #前面必须是一个tab缩进
#①目标时间必须晚于依赖条件的时间,否则更新目录
#②依赖条件如果不存在,找寻新的规则去产生依赖。如下例
#例:hello:hello.o
# gcc hello.o -o hello
# hello.o:hello.c
# gcc -c hello.c -o hello.o
注意:每个目标都可以像ALL(make)一样单独执行,语法:make 目标
2.两个函数
$(wildcard *.c) #匹配当前工作目录下的所有.c文件(例a.c b.c c.c d.c),将文件名组成列表,赋值给变量src。 等价于 $(wildcard ./*.c)
#src = $(wildcard *.c) #将函数结果赋值给变量src
#指定文件夹: $(wildcard ./src/*.c)
$(patsubst %.c, %.o ,$(src)) #将参数3中,包含参数1的部分,替换为参数2.(例:obj=a.o sub.o c.o d.o)
#指定文件夹: $(patsubst ./src%.c, ./obj/%.o ,$(src))
3.三个自动变量
$@: 在规则的命令中,表示规则中的目标。
$^:在规则的命令中,表示所有依赖条件
$<:在规则的命令中,表示第一个依赖条件。 如果将该变量应用在模式规则中,它可将依赖条件列表中的依赖依次取出,套用模式规则。
4.模式规则:
%.o:%.c
gcc -c $< -o $@
扩展:
静态模式规则(就是指定这个模式规则给谁用):
$(obj):%.o:%.c
gcc -c $< -o $@
5.伪目标:
.PHONY:clean ALL #一般加在makefile的最下面,
#目的是为了防止文件中出现同名为 clean 和ALL时,执行make clean 或make命令时出现报错问题。
6.使用变量
myArgs=-Wall -g #用法详看下面示例
引用:
gcc -c $< -o $@ $(myArgs)
7.参数
-n #查看要执行的命令,实际并不执行
-f #指定文件执行 make命令,有些文件为.mk就是nakefile文件
最终和最初makefile文件示例:
- 执行语法
make -n #查看要执行的命令,实际并不执行
make -f makefile文件名 #执行指定的makefile文件名
make 目标名 #执行指定的makefile命令
三、究极版makefile(脚本语言编法)
cc = gcc
prom = calc
deps = $(shell find ./ -name "*.h")
src = $(shell find ./ -name "*.c")
obj = $(src:%.c=%.o)
$(prom): $(obj)
$(cc) -o $(prom) $(obj)
%.o: %.c $(deps)
$(cc) -c $< -o $@
clean:
rm -rf $(obj) $(prom)
解释:
首先是%.o:%.c,这是一个模式规则,表示所有的.o目标都依赖于与它同名的.c文件(当然还有deps中列出的头文件)。再来就是命令部分的@,其中^),具体到我们这里就是%.c。而$@代表的是当前语句的目标,即%.o。这样一来,make命令就会自动将所有的.c源文件编译成同名的.o文件。不用我们一项一项去指定了。整个代码自然简洁了许多。
shell函数主要用于执行shell命令,具体到这里就是找出当前目录下所有的.c和.h文件。而$(src:%.c=%.o)则是一个字符替换函数,它会将src所有的.c字串替换成.o,实际上就等于列出了所有.c文件要编译的结果。有了这两个设定,无论我们今后在该工程加入多少.c和.h文件,Makefile都能自动将其纳入到工程中来。
四、使用make可能会报错
1. 报下面两种错误
- makefile:8: *** missing separator (did you mean TAB instead of 8
spaces?). Stop. - makefile:2: *** missing separator. Stop.
解决办法:
首先一定要用vim去编写这些命令,当行前是tab键时,该行会显示紫色;如果vim编辑不能键入tab那就参考下面方法。
将下面的四行填加到/etc/vim/vimrc
文件中
set tabstop=4 #一个tab键所占的列数
set sw=4 #自动缩进的时候,缩进尺寸为4个空格
set noexpandtab #输入tab时不会自动将其转化为空格
set autoindent #回车后自动缩放
- 输入make命令时误输入了
make'
出去办法,再输入一个'
然后敲回车即可。