Linux项目自动化构建工具-make/Makefile

首先需要提一下Makefile是什么;

会不会写makefile ,从一个侧面说明了一个人是否具备完成大型项目的能力。

一个工程中的源文件不计其数,其按类型,功能,模块分别放在若干个目录中,Makefile定义了一系列的规则来制定,哪些文件先编译,哪些文件后编译,哪些文件需要重新编译。甚至于进行更复杂的功能操作。

Makefile带来的好处就是---“自动化编译”,一旦写好,只需一个make命令,整个工程完全自动编译,极大地提高了软件开发的效率。

make是一个命令工具,是一个解释Makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令。

注意:make是一个命令,Makefile是一个文件。两个搭配使用。

make的工作原理是什么;

1.make会在当前目录下找到名字叫Makefile或makefile 的文件。

2.如果找到,它会找文件中的第一个目标文件,在下面例子中他会找到hello这个文件,并把这个文件作为最终的目标文件。

3.如果hello 文件不存在,或者hello所依赖的后面的hello.o文件的修改时间要比hello新,那么,他就会执行后面所定义的命令来生成hello这个文件

4.如果hello所依赖的hello.o文件不存在,那么make会在当前文件中找目标为hello.c 的依赖性 。如果找到则再根据规则生成hello.o 文件

5当然,如果C文件和H文件是存在的,于是make会生成hello.o 文件,然后再用hello.o声明make 的终极任务,也就是执行文件hello 

6.这就是整个make的依赖性,make会一层一层的去找文件的依赖关系,直到最终编译出第一个目标文件。

7,在寻找过程中,如果出现错误,比如被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误。或是编译不成功,make根本不理。(make只管文件的依赖性,如果找到依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作了)

8.工程是需要被清理的。

9.像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过我们可以显示要make 执行,既命令“”make  clean,以此来清除所有的目标文件。以便重新编译。

10.但是一般我们这种clean的目标文件,我们将他设置为伪目标。用.PHONY修饰。伪目标的特征是总是被执行。

下面makefile要怎样编写呢?

我们先来编写一个C语言写出的程序作为实例。

我们保存退出之后。按之前的方法

如果对目标文件的名字没有神魔要求直接用gcc 加上文件名,就会直接生成一个名为a.out的目标文件。

当我们需要指定目标文件名(hello)时,可以用以下命令,目标文件在源文件之前。

 

但我们今天要学的不是这个。、下面我们开始写Makefile,在同等级的目录下创建一个Makefile文件,开头大小写都是允许的。

在makefile中写出依赖关系和依赖方法。

注意:依赖方法必须以tab 开头

这时我们就构建出了项目,下来我们学习怎么样清理项目

只要加入后面的语句就可以了建立一个伪目标,伪目标文件可以没有依赖的文件如clean。(前面提过伪目标就是一定会执行的目标)

 

下面我们来保存一下,

我们可以看到项目自动化构建已经成功。

有的同学看到这里可能还是不能理解.PHONY标签标记后总是被执行这句话,我再来举一个例子

当Makefile写成现在这个样子时 ,会出现下面的状况,

它会报出hello已经被更新过了的提示,这是因为makefile有这样一条规则:如果hello 文件不存在,或者hello所依赖的后面的hello.o文件的修改时间要比hello新,那么,他就会执行后面所定义的命令来生成hello这个文件,也就是说如果hello存在,且hello后面所依赖得hello.o文件的修改时间不如hello新那么他就不会执行后面所定义的命令来生成hello这个文件。

但当我们把hello用.PHONY修饰后就可以连续的make了(重新编译了)

也就是被.PHONY 修饰后不论什么时候都可以被执行。(其实也就是告诉make不用看修改时间)

 

附加:

makefile 文件书写时以#为注释开头

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值