make&makefile——(1)

56 篇文章 0 订阅

在linux下,make有两个作用。第一个作用,可以通过命令行来编译和安装很多工具。第二个作用,可以用make来管理大型复杂项目编译问题。下面我们主要来介绍用make来管理大型复杂项目的编译问题。
make像命令行参数一样接受目标。这些目标通常放在Makefile(或makefile)来命名的特殊文件中,同时这个文件也包含与目标相对应的操作。当make命令第一次执行时,它扫描Makefile找到目标以及其依赖。如果这些依赖自身也是目标,那么就继续为这些依赖扫描Makefile建立起依赖关系,然后编译他们。一但主依赖编译之后,然后就编译主目标。

上面这段话有没有感觉很绕,简直让人无法忍受,没关系,再举个栗子:一个test.c程序要想生成可执行程序,必须经过一下几个步骤:
这里写图片描述

换句话说,要生成可执行文件test必须先生成目标文件test.o,要生成test.o文件必须先生成汇编文件test.s,要生成test.s文件必须先生成test.i文件,要生成test.i文件必须要有源文件test.c。也就是说他们之间的依赖关系是:
这里写图片描述

只有依赖关系还不够,还要有依赖方法:
这里写图片描述
而在Makefile文件中保存的就是这种依赖关系和依赖方法。

在大型项目中,有成百上千个文件,我们要对这些文件进行编译的话,当然不可能一个文件一个文件的进行编译,因为这样的话效率简直太低了,而且一旦中间有一个文件编译错误的话,前边所有的努力就白费了。这时候我们就可以通过Makefile定义一系列的规则来指定,哪些文件需要先进行编译,哪些文件需要后编译,哪些文件需要进行重新编译,甚至是更加复杂的功能。makefile的好处就是”自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大地提高了软件开发的效率。而make只是一个命令工具,是一个解释Makefile中指令的命令工具。

make命令在执行的时候,需要一个Makefile文件告诉make命令需要怎么样去编译和链接程序。所以会不会写Makefile,从侧面就说明了一个人是否完全具备完成大型工程的能。
make编译和链接程序的规则就是:
1、如果这个工程没有编译过,那么我们所有的C文件都要编译并被链接
2、如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3、如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
当我们写完Makefile之后,只需要用一个make命令就可以实现自动的编译文件和链接目标程序。

Makefile的书写规则:
targets:prerequisites …
[Tab] command

其中target是一个目标文件,可以是二进制目标文件,也可以是可执行文件们还可以是一个标签(伪目标)。prerequisites是生成target的先决条件,也就是依赖文件。command就是依赖方法,也就是由prerequisites生成target的方法。语法规定,command前面必须是以[Tab]键开头的。而且每一个targets:prerequisites的下一行必须是command。

示例1:
Makefile文件:
这里写图片描述

结果:
这里写图片描述

每个Makefile后面都应该写一个清空目标文件的规则,这不仅便于重编译,也利于保持文件的清理。clean不是一个文件,他只是一个动作的名字,就像是一个标签一样,其冒号后面什么也没有,那么make就不会自动去找该文件的依赖文件,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在make命令后面显示的之处这个标签。.PHONY表示后面的clean是一个伪目标。
虽然这个栗子可能不是很恰当,但用它来说明一下Makefile的语法还是可以的。当然Makefile中还有许多高级的用法,这个留在下次再介绍,到这里相信已经能写一个简单的Makefile文件了吧,如果还不能的话请看下面的这个栗子。

示例2:
现在有Add.c、Sub.c、Add.h、Sub.h、test.c文件,用Makefile文件编写他们的编译和链接规则。
这里写图片描述

test.c文件:
这里写图片描述

下面我们来编写Makefile文件:
这里写图片描述

运行结果:
这里写图片描述

make是如何工作的???
在默认的方式下,也就是我么输入make命令后:
1、会在当前目录下寻找Makefile或makefile文件。
2、如果找到的话,他会找文件中的第一个目标文件(target),例如示例2中的test文件,并把这个文件作为最终的目标文件。(所以在我们写Makefile文件的时候,要倒着来推导依赖关系)。
3、如果test文件不存在,或者test所依赖的文件的文件修改时间比test文件要新,那么make就会执行后面所定义的命令来重新生成test这个文件。
这就是make的依赖性,make会一层一层的去找文件的依赖关系,直到最终编译出的第一个目标文件。在寻找的过程中,如果出现错误,比如被依赖的文件找不到,那么make会直接退出,并报错,make只管文件的依赖性,不会去管类似于定义错误,编译不成功,或者是文件找不到等错误。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值