【Linux系统编程】项目自动化构建工具make/Makefile--1https://developer.aliyun.com/article/1424705
Makefile/makefile语法使用:
1,.PHONY的使用
当我们不想改变文件所对应的时间时进行连续编译,这时需要在Makefile/makefile文件中进行.PHONY修饰伪目标。
[zhu@zhujunhao ~]$ vim Makefile [zhu@zhujunhao ~]$ cat Makefile .PHONY:code.exe #修饰code.exe目标文件,成为一个伪目标,使其总是可以被执行 clean: #我们也可用.PHONY修饰clean目标,即.PHONY:clean,使其总是执行 rm -f code.exe code.exe:code.c gcc code.c -o code.exe [zhu@zhujunhao ~]$ make code.exe gcc code.c -o code.exe [zhu@zhujunhao ~]$ make code.exe gcc code.c -o code.exe [zhu@zhujunhao ~]$ make code.exe gcc code.c -o code.exe
2,名称的替换
在Makefile/makefile文件中可用 “ = ” 进行名称替换工作,使用别名时只需用 $(别名) 进行替换即可,如下:
#使用 = 进行名称的替换 g=gcc o=-o c=code.c exe=code.exe #使用别名替换,即:$(别名) .PHONY:$(exe) #修饰code.exe目标文件,成为一个伪目标,使其总是可以被执行 clean: rm -f $(exe) $(exe):$(c) gcc $^ $(o) $@ # $@代表目标文件,$^代表依赖文件列表
3,语法推导
在Makefile/makefile中,若存在多个依赖关系,当make运行其中一个依赖关系的依赖方法时,系统会先判断依赖关系中对应的依赖文件列表,并且对应的依赖文件不存在时,将会自动往下继续寻找,直到找到指定的命令来生成这个目标文件,若找不到,系统将会报出异常;若找到了,系统将会往上不断返回执行对应的指令,以便生成这个目标文件。如下:
[zhu@zhujunhao ~]$ vim makefile [zhu@zhujunhao ~]$ cat makefile code.exe:code.o gcc $^ -o $@ code.o:code.s gcc -c $^ -o $@ code.s:code.i gcc -S $^ -o $@ code.i:code.c gcc -E $^ -o $@
以上的makefile的工作流程是这样的:
首先,当你运行 make code.exe时,make会检查 code.exe是否已经存在。如果存在,make就不会重新编译。如果不存在,make会找到它的依赖文件code.o,若依赖文件code.o 不存在,系统将往下查找,运行指定的命令来生成这个目标文件。这个过程会一直继续,直到所有的目标文件都被生成。
然后,对于每个目标文件,makefile都会检查是否所有的依赖文件都已经被更新。如果是,那么目标文件就会被重新编译。这个过程会一直继续,直到所有的目标文件都被更新。 如果命令失败了或全部指令运行完之后目标文件还没有被更新,make会停止并显示错误信息。
总的来说,makefile定义了如何将C语言源代码code.c编译成可执行文件code.exe的过程。在编译过程中,它首先将C语言源代码预处理为中间文件code.i,然后将中间文件编译为汇编文件code.s,接着将汇编文件code.s编译成二进制文件code.o,最后将二进制文件链接为可执行文件code.exe。
[zhu@zhujunhao ~]$ make gcc -E code.c -o code.i gcc -S code.i -o code.s gcc -c code.s -o code.o gcc code.o -o code.exe
可看出,Makefile/makefile的程序指令运行中,依赖关系如同栈结构中不断推导进栈,当查找到最终所以属的目标文件时,依赖关系中对应的依赖方法将会不断的出栈运行。这种形式就叫做makefile/Makefile的语法推到过程。
总:使用make和Makefile/makefile可以简化编译和构建程序的过程,只需要编写一个简单的Makefile/makefile文件,就可以自动化地编译和链接程序。同时,Makefile/makefile还可以在不同的平台上使用,使得程序的构建更加灵活和可移植。