【Linux】项目自动化构建工具-make/Makefile的使用

目录

前言

依赖

依赖关系

依赖方法

使用

项目清理


前言

🎐在使用 Linux 的时候应该已经察觉到,在 Linux 环境下我们会有非常多的源文件,并且在使用前还需要手动编译,在使用的时候就会变得非常地麻烦。

🎐但 make/Makefile 的出现就解决这些问题, Makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。 Makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。

🎐同时,值得注意的一点是, make 是使用时输入的命令,而 Makefile 是一个文件里面包含了构建编译所需要的一系列规则。

依赖

🎐使用 make/Makefile 完成一件事情的前提就是需要正确的依赖关系+正确的依赖方法。

依赖关系

🎐可以简单的理解为,文件1来源于文件2则说明文件1依赖于文件2。例如我要得到可执行文件 text ,在那之前我必须先要有作为源文件的 text.c 才能对其进行编译进而得到 text ,便称 text 依赖于 text.c 

依赖方法

🎐依赖方法就是在依赖的关系之上将二者进行连接的方法,还是上面的例子,我们知道了 text 依赖于 text.c ,那二者之间的依赖方法就是通过 gcc 进行编译的命令 gcc -o text text.c 了。

使用

🎐为了方便理解将编译链接的各各步骤拆分出来进行讲解。

 text:text.o                      //text依赖于text.o
      gcc -o text text.o
  text.o:text.s                   //text.o依赖于text.s
      gcc -c -o text.o text.s     
  text.s:text.i                   //text.s依赖于text.i
      gcc -S -o text.s text.i
  text.i:text.c                   //text.i依赖于text.c
      gcc -E -o text.i text.c
  •  make 会在当前目录下找名字叫 Makefile 或 makefile 的文件(要自己创建)。如果找到,它会找文件中的第一个目标文件,在上面的例子中,他会找到 text 这个文件,并把这个文件作为最终的目标文件。
  • 如果 text 文件不存在,或是 text 所依赖的后面的 text.o 文件的文件修改时间要比 text 这个文件新,那么,他就会执行后面所定义的命令来生成 text 这个文件。
  • 如果 text 所依赖的 text.o 文件不存在,那么 make 会在当前文件中找目标为 text.o 文件的依赖性,如果找到则再根据那一个规则生成 text.o 文件。(这有点像一个堆栈的过程)
  • 你的C文件和H文件是存在的,于是 make 会生成 text.o 文件,然后再用 text.o 文件声明
  • make 的最终任务,就是得到可执行文件 text 
  • make 会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  • 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么 make 就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make 根本不管。
  • make 只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,就会停止运行。

项目清理

🎐如上的使用make之后会生成 make.i make.s make.o make 四个文件,每次都输入一长串命令去删除未免过于麻烦,可以将删除项目文件也并入 Makefile 之中。

.PHONY: clean
clean:
    rm -f text.i text.s text.o 

 🎐.PHONYmake/Makefile语法中的一个关键字,代表的意思是:总是被执行的。举个例子,当我们使用 make 生成 text 之后上一次修改 text.c 的时间仍晚于 text 且再次使用 make 则不会生成新的 text 

[Alpaca@VM-12-9-centos myfile]$ make
gcc -o text text.c
[Alpaca@VM-12-9-centos myfile]$ make
make: `text' is up to date.
[Alpaca@VM-12-9-centos myfile]$ make
make: `text' is up to date.

 🎐若是将text也并入 .PHONY 之中这个命令就是总是被执行的,有以下两种写法可以自由选择。

.PHONY: clean text 
text:text.o                      //text依赖于text.o
      gcc -o text text.o
text.o:text.s                    //text.o依赖于text.s
      gcc -c -o text.o text.s     
text.s:text.i                    //text.s依赖于text.i
      gcc -S -o text.s text.i
text.i:text.c                    //text.i依赖于text.c
clean:
    rm -f text.i text.s text.o 
.PHONY: text 
text:text.o                      //text依赖于text.o
      gcc -o text text.o
text.o:text.s                    //text.o依赖于text.s
      gcc -c -o text.o text.s     
text.s:text.i                    //text.s依赖于text.i
      gcc -S -o text.s text.i
text.i:text.c                    //text.i依赖于text.c
      gcc -E -o text.i text.c
.PHONY: clean
clean:
    rm -f text.i text.s text.o 

🎐精简之后就是这个样子的。

text:text.c                   //text依赖于text.c(依赖关系)
    gcc -o text text.c        //使用gcc对text进行编译链接得到text.c(依赖方法)
.PHONY: clean                 //clean总是被执行                                                                                                                             
clean:                        //clean也是一个文件且不依赖于其他文件(依赖关系)
    rm -f text                //通过rm删除可执行文件(依赖方法)

 在make/Makefile的帮助下可以有效地提升 Linux 的使用效率,好了,这次 make/Makefile 的介绍就到这里结束了,关注博主共同进步!!

评论 117
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LinAlpaca

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值