漫话linux:项目自动化构建工具make/makefile

1.make的基本概念

 make是一个在Linux下广泛使用的自动化构建工具,它可以根据一个Makefile文件中的指令来自动执行编译、链接等操作,从而生成一个可执行文件或者库文件。通常情况下,使用make工具可以极大地简化代码的编译和构建过程。

      会不会写 makefile ,从一个侧面说明了一个人是否具备完成大型工程的能力 ,一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作 makefile 带来的好处就是 ——“ 自动化编译 ” ,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。

2.makefile的使用

1.创建makefile
#include <stdio.h>
int main()
{   
printf("Hello,Makefile");
    return 0;
}

接着我们通过vim创建一个文件名是makefile或Mikefile的文件

并在里面输入指令

   test2:test2.c
      gcc -o test2 test2.c  

在这之后,我们直接输入make,就等价于把gcc -o test test.c

[root@VM-4-13-centos ~]# make
gcc -o test2 test2.c	
2.报错解决

1.保存文件

E212: Can't open file for writing
 
Press ENTER or type command to continue

这说明你没有写入的权限,可能是你自己之前不小心修改了文件的权限,有或许这是别人提供给你的只读文件

解决方法:通过su切换为root或者sudo提权为root,或者chmod修改文件权限

2.vim修改文件时报错

E37: No write since last change (add ! to override)

解决方法:使用命令:w!强制存盘即可,在vim底行模式下输入:w!

3.运行make时错误

makefile:2: *** missing separator.  Stop.

解决方法:  注意我们的依赖方法开头是一个tab键,不是四个空格,若你有自动缩进那就先把空格删了再按缩进,依赖关系输入的:必须是英文的

3.工作原理

1.基本概念

makefile中输入了两行代码,第一行文件名+‘:’+文件名     他是依赖关系,左边的文件是目标文件,右边的文件叫做依赖关系列表,它可以是多个文件。第二行是依赖方法

2.依赖关系

   1.是指在编译程序时,一个文件(如源文件或目标文件)需要另一个文件(如头文件或其他源文件)的内容才能正确编译的关系。在编译过程中,如果一个文件发生改变,那么它所依赖的文件也需要重新编译。

       2.依赖关系可以形成层序结构,即a依赖b,而b又依赖c,c依赖d,当执行a的指令时,如果发现b不存在,就会通过bc之间的依赖方法生成b,以此类推。

3.依赖方法

 1.它是指通过一些手段来确定依赖关系的方法。比如,在Makefile文件中使用伪目标和依赖文件列表来定义编译规则。

 2.依赖方法可以包含多条命令,每条命令用回车分隔

4.目标文件

   make 命令要生成的文件,通常是可执行程序、中间目标文件、动态链接库或静态链接库等输出文件。

5.依赖文件列表

1.是指一个文件所依赖的其他文件列表。在Makefile文件中,可以使用依赖文件列表来定义编译规则,确保所有依赖文件都已经被编译过,才会编译当前的目标文件。

2.依赖文件列表可以包含多个文件,用空格分隔

6.make clean

vim打开makefile,添加内容

 1: makefile+  ⮀                                                                                                                                                                                    ⮂⮂ buffers 
  1 test2:test2.c
  2     gcc -o test2 test2.c
  3 clean:
  4     rm -f test2

第三行是clean的依赖关系,可以发现:后面什么都没有,表示clean不依赖任何文件列表

第四行是clean的实现方法

我们再命令行输入make clean,可以看到依赖方法被执行了

[root@VM-4-13-centos ~]$ make clean
rm -f test2

再ll一下当前文件目录,发现之前的test2可执行文件确实不见了

为什么执行第一个生成可执行文件的指令直接使用make就可以,但是执行删除可执行文件需要输入make clean才能执行呢?

当命令行中输入的make后面不接任何内容时,则会在makefile从上往下查找,找到第一个依赖关系进行执行

4.进阶操作

1.文件名替代

makefile中,指令内部的目标文件可以用$#代替,依赖文件列表可以用$^代替

2.创建变量

x=test2.
makefile中是可以定义变量的,等号赋值

使用方法为用$(变量名来替代原来文件名的位置)

3.PHONY用法

gcc多次编译同一个文件是没有限制的

不难发现,第一次我们make成功,但是之后的make都被拒绝了,这是因为make在执行编译之前会先检查源文件是否被修改,如果没被修改,那么再一次进行编译是没有意义的(因为前后生成的可执行文件一样),那他就会拒绝执行,但是如果需要执行,就需要PHONY用法,

PHONY在Makefile中是一个非常有用的特殊目标。当make执行到PHONY目标时,它会无条件执行该目标下定义的命令,而不会检查是否有同名的文件在。

因此我们就可以对mybin使用这个PHONY,让它强制执行命令,不论当前目录下有没有mybin。修改语法

.PHONY:xxx

xxx是一个依赖文件名,此时xxx应的命令就会被强制执行。

.PHONY:mybin
mybin:test.c
	gcc -o mybin test.c

此时mybin会强制执行命令,无论文件是否存在

4.PHONY的原理在PHONY的后面的文件被称作伪文件,也就是伪目标

1.这个伪目标本身并不代表任何一个文件,执行这个目标的目的不是真切的改变某个文件,只是要强制执行这个目标

2.伪目标一般都没有依赖,因为执行伪目标就是为了执行目标下面的命令。既然一定要执行命令了那就不必加依赖,因为不加依赖意思就是无条件执行

3.伪目标可以直接写,不影响使用,但是有时候为了明确声明这个目标是伪目标会在伪目标的前面用.PHONY来明确声明它是伪目标

优点:防止makefile中只执行命令的目标和实际工作目录下文件的名字冲突,并且提高makefile的效率

比如伪目标clean,如果当前目录下刚好有一个叫做clean的文件,那么clean作为一个目标文件,由于已经出现了目标文件,那么依赖方法就不会执行,就像上面的创建可执行文件一样被禁止执行。可是我们用PHONY声明clean作为一个伪目标,clean的依赖方法就会被强制执行了

clean:
    rm -rf *.o

make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值