Makefile的基本语法

一、什么是make

        make是一个命令工具,是一个解释makefile中指令的命令工具。

二、为什么要学习make命令

        举例子:我们平时在linux上使用的编译器gcc,现有5个.c文件(  a.c     b.c    c.c    d.c    e.c

         编译指令:  gcc    a.c     b.c    c.c    d.c    e.c    -o    test       

  当我们进入工作时,需要编译很多.c文件,比如编译上百上千的文件,我们用上述方法,不好。

原因如下:

 1、容易漏敲某个.c文件,导致编译失败,排查费时间

 2、当我们没有漏敲,并且成功生成可执行文件。但我们需要修改某个文件,得重新编译每一个.c

 3、工作时,我们很多写的代码都需要跨平台使用,比如写进ARM 需要使用    arm-linux-gcc指令

      总结:编译麻烦——为了方便编译,因此我们需要学习make指令与用法

三、make很好解决了上述问题

(1)大量代码关系维护

        大项中源代码比较多,手工维护、编译时间长而且编译命令复杂,难以记亿及维护。因此
把代码维护命今及编译命今写在makefile文件中,然后再用make工具解析此文件自动执行相应命令,可实现代码的合理编译。

(2)减少重复编译时间

        在改动其中一个文件的时,能判断哪些文件被修改过,可以只对该文件进行重新新编,然后重新链所有的目标文件,节省编译时间

四、什么是Makefile

Makefile是一个文件,这个文件中描述了我们程序的编译规则——类似脚本

当我们执行make命令时,make命令就在当前目录下找Makefile文件,根据文件里面的执行规则,编译程序。

注意:Makefile规则文件是我们程序员根据自己的程序,编写的编译规则。

五、使用Makefile的好处

     1、简化编译程序的时候输入命令,如上述的 gcc    a.c     b.c    c.c    d.c    e.c    -o    test    

直接 输入一个   make     即可完成编译

     2、节省编译时间,提高编译效率

六、Makefile的语法规则

 目标文件:依赖文件列表

<tab>编译命令                                        //<tab>   这是tab键

clear:

<tab>rm  目标文件    -rf                          //使用make clear  命令:删除生成的目标等文件

 1、目标文件:

       通常是我们最后编译得出可执行文件

2、依赖文件

      是用来输入而产生的目标文件的文件

      一个目标文件通常有几个依赖文件(也可以只有一个)

             gcc     依赖文件    依赖文件        -o      目标文件           (多个依赖文件)

             gcc      依赖文件    -o     目标文件                                   (一个依赖文件)

除此以外:目标文件的依赖文件,可为.c文件   也可为 .o文件

举个例子: 现有三个.c文件  一个头文件,分别为 :   main.c     a.c     b.c     head.h

 (1)平时用的编译模式        

   (2)使用make指令,完成编译

     第一步:在当前位置,创建一个Makefile文件

         指令:  vim  Makefile                    

    第二步:根据编译程序.c 文件指定编译规则

第一种编写(不常用且无法查看哪个文件被修改过,跨平台无法使用——编译会失败)

 输入make命令并且执行文件

输出结果与删除操作演示

第二种编写(可查看哪个文件被修改,但跨平台无法使用——编译会失败)

输入make命令并且执行文件

输出结果与删除操作演示 

第三种编写(即可查看文件修改,也可跨平台使用)基于第二种编写改编得到——不懂看第八节

七、make命令格式

           前面所使用的都是单独  make ,难道不都全是使用单独  make ?   答案:不是的

简单来讲,单独使用 make  与创建的Makefile名称有关。

单独的  make  默认在工作目录下寻找名为 : GNUmakefile  、Makefile  、makefile文件作为makefile输入文件。

简单来讲,就是创建名为: GNUmakefile  、Makefile  、makefile  其中一个,

                  就可以 使用单独的  make  指令

如果创建的 不是   上面3种  的其中一种,必须使用    make  -f   文件名

比如:创建一个  Makefile1  (此 Makefile1  不是   上面的三种)

就不能使用单独  make指令    而是使用        make  -f   Makefile1    

 八、Makefile的自定义变量(学会了此节,你已经基本掌握了)

定义变量:

             变量名=变量值

引用变量:

            $(变量名)    或者   ${变量名}

makefile的变量名:可以用数字开头。

8.1举例子:如下图(此举的例子是第一种编写方式)

 变为如下图

 解析:$(cc)  就是gcc       但此$(cc)是可以跨平台编译

            $(obj)   就是   main.c    a.c    b.c

同理: $(target)  就是  main

总之就是换个名字,跟原图的意思是一样的。

为什么要这样,方便,快捷,

当我们有上千个.c文件的时候,直接可以把上千个.c文件,用一个名字代替,引用它   $(名字)

8.2举例子:如下图(此举的例子是第二种编写方式)

                

突然发现,当我们.c文件存在上百的时候,用此方法写的代码也很多,因此,看第九节,如何写更简便的代码。 

 九、预定义变量

makefile中有许多预定义变量,这些变量具有特殊的含义,可在makefile中直接使用。

常用的有:

      $@       目标名    (即 “  ”   左边的就是目标名)如   main:main.c   (main为目标名)

      $<      依赖文件列表的第一个文件     如;   main:main.c a.c  b.c   ($<    即为红色字体第一个 main.c)

     $ ^      所有的依赖文件        如;   main:main.c a.c  b.c   ($^   即为红色字体)

     CC        C编译器的名称,默认值为cc

     CFLAGS   C编译器的选项

完善规则如下图

学会,双击点个赞 !!! 

猜你喜欢

转载自blog.csdn.net/weixin_47783699/article/details/128885426