vlambda博客
学习文章列表

C语言中的高级工程管理器——Makefile



C语言中的高级工程管理器——Makefile

文章整理:persistenceBin

Make

Make称为工程管理器,就是指管理较多的文件,在刚接触C语言编程的时候接触到的大多是单个的 .c 文件,而在实际项目中,一个工程往往是由若干个 .c 文件来组成的,如果我们想要更高效的去编译,就借助到了Make工程管理器,也就是“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作;Make可以只编译改动的代码文件,而不用完全编译,所以效率较高。


Makefile设计


这个地方需要先熟悉一下之前分享过的文章中的内容——GCC编译过程    
Makefile是Make读入的唯一配置文件,由make工具创建的目标体(target),通常是目标文件或可执行文件;要创建的目标体所依赖的文件(dependency_file); 创建 每个目标体时需要运行的命令(command);
看完之后我们来认识一下这个神器:
语法

## 是注释

1.语法格式(最简单的Makefile):
目标文件 :依赖文件
hello.i : hello.c  gcc -E hello.c -o hello.i    #gcc前面是Tabhello.s : hello.i gcc -S hello.c -o hello.s #gcc前面是Tabhello.o : hello.s  gcc -c hello.c -o hello.o    #gcc前面是Tabhello : hello.o  gcc hello.o -o hello      #gcc前面是Tab

注意:命令行前面必须是一个“Tab”键,否则编译错误为“ *** missing separator.  Stop”

2.第一个目标文件是我们的终极目标(貌似有点像递归)
#从终极目标一步步往下找
hello : hello.o gcc hello.o -o hello.exe #gcc前面是Tabhello.o : hello.s gcc -c hello.c -o hello.o #gcc前面是Tabhello.s : hello.i gcc -S hello.c -o hello.s #gcc前面是Tabhello.i : hello.c gcc -E hello.c -o hello.i #gcc前面是Tab
3.伪目标

可以只编译改动的代码文件,而不用完全编译,所以效率较高。

不成文的规矩是——“clear从来都是放在文件的最后
#代码末尾加关键字:  .PHONY:#能够根据文件时间戳自动发现更新过的文件而减少编译的工作量;
#删除所有文件clearall:  rm -rf hello.i  hello.S  hello.o  hello#删除过程文件clear:  rm -rf hello.i hello.S hello.o  

C语言中的高级工程管理器——Makefile

4.变量 = 替换

为了makefile的易维护,在makefile中我们可以使用变量makefile 中的变量也就是一个字符串,理解成C语言中的宏可能会更好。

所以一个升级版的 makefile 就是如下这样

C语言中的高级工程管理器——Makefile

C语言中的高级工程管理器——Makefile

 反斜杠(\是换行符的意思,这样比较便于Makefile的易读。我们可以把编辑好的文本内容保存在文件为“Makefile”“makefile”的文件中,然后在该目录下直接输入命令 make 就可以生成执行文件。如果要删除执行文件和所有的中间目标文件,那么,只要简单地执行一下 make clear 就可以了。
在这个 makefile 中,目标文件( target )包含:执行 文件和中间目标文件( *.o ),依赖文件( prerequisites )(就是冒号后面的那些 .c 文件和 .h文件)。每一个 .o 文件都有一组依赖文件,而这些 .o 文件又是执行文件的依赖文件。依赖关系的实质上就是说明了目标文件是由哪些文件生成的,换言之, 目标文件是哪些文件更新的
在定义好依赖关系后,后续的那一行定义了如何生成目标文件的 操作系统命令 ,一定要以一个Tab 作为开头
make 并不管命令是怎么工作的,他只管执行所定义的命令。make会比较 目标文件和依赖文件的修改日期,如果 依赖文件的日期要比目标文件的日期要新,或者目标文件不存在的话,那么,make就会执行后续定义的命令。

这里要说明一点的是,clear不是一个文件,它只不过是一个动作名字,有点像C语言中的标签一样,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在make命令后明显的指出这个标签的名字。这样的方法非常有用,我们可以在一个makefile中定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份等等。

C语言中的高级工程管理器——Makefile

C语言中的高级工程管理器——Makefile


‧  END  


若文章对你有帮助,在页面右下角点个 在看。


最 后
 

若觉得文章不错,转发分享给更多的朋友


交易担保 粉丝社 欢迎留言,一起学编程!