【Linux】make和makefile详解

在linux系统上编译大一点的项目时,会用到make/makefile文件
1.make与makefile
利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。 而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员来说简直就是一场灾难。 而make工具则可自动完成编译工作,并且可以只对程序员在上次编译后修改过的部分进行编译。 因此,有效的利用make和makefile工具可以大大提高项目开发的效率。

make工具功能

利用make工具可以自动完成编译工作,这些工作包括:

如果修改了某几个源文件,则只重新编译这几个源文件
如果某个头文件被修改了,则重新编译所有包含该头文件的源文件
利用这种自动编译可以大大简化开发工作,避免不必要的重新编译。make工具通过一个称为Makefile的文件来完成并自动维护编译工作,Makefile文件描述了整个工程的编译、连接规则。

makefile工具功能

Makefile描述了整个工程的编译连接规则。makefile表明了目标文件和源文件的依赖关系和依赖方法
举个简单的例子:

【Linux】make和makefile详解_第1张图片

 在一个目录下创建一个源文件,创建一个makefile文件,makefile文件中添加目标文件与源文件依赖关系和依赖方法:

    依赖关系:  目标文件:mycode  依赖  源文件:test.c 

    依赖方法:gcc test.c -o mycode

【Linux】make和makefile详解_第2张图片

 使用make命令,生成了目标文件mycode   ./mycode 运行可执行程序 就打印出了运行结果。这就是make与makefile的简单使用。这里是项目的生成,下面加入工程的清理:

【Linux】make和makefile详解_第3张图片

当我们不需要生成的可执行程序文件时,使用 make clean 命令就可以完成对文件的清理工作

【Linux】make和makefile详解_第4张图片

 有细心的小伙伴发现我们在使用make命令编译时什么都不加但是为什么清理时就需要加

make clean 那是因为make在执行makefile文件里的内容时,从上往下执行,第一个依赖关系和依赖方法执行完之后就停止了,第一个make mycode 的mycode可以省略 ,但是第二个起就不能省略了,只能完整的使用 如:make clean 

【Linux】make和makefile详解_第5张图片

连续的编译一个文件会提示xxxx is up to date   说明不能连续的编译但是连续的make clean 

却不会报错:

【Linux】make和makefile详解_第6张图片

原因是在makefile:中在clean 前加了一个 .PHONY  这个指令代表这一指令总是被执行,所以连续执行clean不会提示。不能连续编译,是编译器的一种只能检查的表现,源文件在没有改变的情况下就没必要进行再编译,我的的小程序没有多大的影响,对于一个大项目来说重新编译会浪费时间也没有必要。

这就又引出了一个问题,编译器是怎么识别这个程序需不需要重新编译?

每一个文件都有文件属性:

【Linux】make和makefile详解_第7张图片

每个文件都有三个时间:

1.Access:访问文件的时间

 2.Modify:修改文件内容的时间

3.Change:修改文件属性的时间

每次访问文件不一定修改Access的时间,因为访问文件的次数是很多的,但是这个时间也没必要每一次访问都修改,对于系统来说是一个很大的工程,访问文件的时间也没有那么重要,所以可能多次访问改变一次文件的 Access的时间。文件的大小改变那Modify的时间就会改变,文件的大小是文件的属性所以Change的时间一定会改变。Change的时间会随着用户chmod 手动改变文件的属性而改变。touch  xxx  可以更新xxx文件的三个属性。

源文件的Modify 没有改变,在编译好的情况下,就没有必要进行再编译,所以编译器只用比较

源文件的Modify和目标文件的Modify时间,判断需不需要重新编译。若源文件的Modify 时间新则可以进行再编译,反之,不编译。加了.PHONY系统就不会根据自己的判断去决定指令该不该执行,而是总是执行指令。

你可能感兴趣的:(linux,运维,服务器)