Makefile知识小记

gcc是linux中的编译器,它是通过某种规则来进行编译的,在这之前还有一个linux自带的构建器叫make,make也需要通过某种规则来构建,而这些规则就通过makefile来设定。
makefile文件的命名可以是makefile或Makefile。
makefile中的规则
 三部分:目标、依赖、命令
  目标:依赖
  (tab缩进)命令

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

makefile中由一条或多条规则组成。

makefile的工作原理
 第一行的目标是做为这个makefile要生成的最总目标,会依次检测依赖是否存在,当依赖不存在,会向下搜索下边的规则,如果有规则是用来生成查找的依赖的,执行规则中的命令;如果依赖存在,则会判断是否需要更新该依赖,因为目标的生成时间应该要比依赖的时间要晚才对。例如:

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

app依赖于三个.o文件,会依次查找依赖是否存在,当发现a.o不存在时,向下搜索到第二条规则,执行,生成a.o,其他两个类似,然后在生成app;当对a.c文件进行修改后,a.o的生成时间将比a.c要早,再次执行make时会判断时间,然后更新a.o,即再执行第二条规则。

makefile中的变量
 以上的makefile的编写显得冗余,可以用变量来改善:
 makefile自带的变量(都是大写)
  CPPFLAGS、CC等,这些变量有些已经被赋值,但还是可以用来赋值
 自动变量
  $@ : 规则中的目标
  $< : 规则中的第一个依赖
  $^ : 规则中所有的依赖
  自动变量只能在规则中的命令中使用
修改上面的makefile

obj = a.o b.o c.o					# makefile中的注释用#号
target = app
$(target) : $(obj)
	gcc $(obj) -o $(target)			# gcc %^ -o $@
%.o : %.c
	gcc -c $< -o $@

其中obj和target是自定义变量,值分别为三个.o文件和要生成的目标文件,“$”符号表示去取变量的值;“%”是一个通配符,做模式匹配用,例如在第一次查找依赖a.o时,发现没有,向下查找规则,%被替换成a,第二次查找b.o又被替换成b。

makefile中的函数
 为了使makefile在移植性方面做得更好,可以使用函数来改善,这是因为makefile中的所有函数都是有返回值的。
 查找指定目录下指定类型的文件:

src = $(wildcard ./*.c) #当前目录下的所有.c文件返回到src中。

匹配替换:

obj = $(patsubst %.c,%.o,$(src))				#将src中的.c替换成.o

再修改上面的makefile

src = $(wildcard ./&.c)
obj = $(patsubst %.c,%.o,$(src))
target = app
$(target) : $(obj)
	gcc $(obj) -o $(target)			# gcc %^ -o $@
%.o : %.c
	gcc -c $< -o $@ 

清理项目
可以在makefile中添加清理项目的规则:

.PHONY clean
clean:
	rm *.o $(target) -f					#加上-f表示强制删除

声明伪目标
伪目标的用处在于不想让make对目标做判断是否是最新的,例如在文件夹下有文件名为clean,但makefile中有clean规则,执行make clean时就会收到clean的影响,将clean声明为伪目标可以避免这种影响,方法是在clean规则上加上:
.PHONY clean

猜你喜欢

转载自blog.csdn.net/rest_in_peace/article/details/82854733