来,手摸手教你写makefile

  1. 为什么要用makefile?
    makefile其实是一个代码管理工具,当做项目的时候,如果文件很多的话,gcc就会写很长很复杂,代码一旦长的话就容易出错,这时候我们就需要有一个代码管理工具,这个工具就是makefile。我们可以把所有代码编译的命令写到makefile中,我们只需要执行makefile中的一些命令来对程序进行编译,编译完后就会生成一个可执行文件。

  2. makefile的命名:makefile或Makefile

  3. makefile中的规则:
      规则中的三要素:目标,依赖,命令
      一般格式:目标:依赖条件
          Tab缩进(回车后如果没有自动缩进要手动按Tab进行缩进)命令在这里插入图片描述
    解释:app是一个目标,依赖条件为两个.c文件,gcc为命令。
    这是一次性编译里面的所有文件,但是如果文件多的话,且你只修改了其中一个文件的一个字符,这时候就不需要全部编译,只需要编译有修改的文件,因为如果文件多的话编译很耗时间。来,手摸手教你写makefile_第1张图片
    解释:app是终极目标,client.o和server.o是依赖,编译的时候遇到第一个依赖项client.o,发现原来没有这个文件,就会去查找下面的子目标,终极目标的依赖项为子目标的目标,找到后执行子目标生成client.o。以此类推,直到完成终极目标的所有依赖,然后执行第二行生成app的可执行文件。注意:终极目标一定要写在第一行。

  4. 工作原理:
    makefile在在执行的过程中,先执行子目标,然后再执行终极目标,即执行终极目标的时间比其他.o文件新,.o文件比.c新。例如当你更新了client.c文件时,再次执行makefile时,发现client.c比client.o新,则client.c被修改了,需要执行gcc生成client.o,则此时client.o的时间比client.c新。当app发现client.o比自己的时间新,则此时会执行自己的gcc生成一个最新的app。通过对比时间。来,手摸手教你写makefile_第2张图片

  5. makefile中的变量
    从上面的截图中可以看到代码有很多是相似的,这时候我们就会想到能不能有模板或者变量来替代它们来使得makefile看起来更加简洁,这时候就要用到变量了。上代码再解释来,手摸手教你写makefile_第3张图片
    解释:
    (1)将client.o server.o赋值给obj,在makefile中变量是没有类型的,用"$(变量)"来取变量的值
    (2)%.o和%.c类似一个模板,即将子目标的.o和.c文件分别代入
    (3)dollor符< 表示规则中的第一个依赖
    (4)dollor符@ 表示规则中的目标
    (5)dollor^ 表示规则中所有以依赖
    (6)第一个gcc则可以写成gcc $^ -o $@
    (7)这些变量只能在变量的命令中使用
    除了自定义的变量外,makefile还有自己维护的变量,一般都是大写。这些变量不管有没有初始值都可以对它们赋值,例如CPPFLAGS,CFLAGS,LDFLAGS。

  6. makefile中的函数
    在写makefile的时候,.c文件少还好,要是有几百个的话手写不光累,而且容易写错,所以makefile给我们提供了这样的一个函数,可以在指定目录下查找所有.c文件,然后再用另一个函数将它替换为.o文件。上代码再解释来,手摸手教你写makefile_第4张图片
    解释:
    (1)代码中第二行就是查找.c文件,./后面是路径,可以指定目录或者直接用*查找所有.c文件,查找出来的是一串字符串,然后赋值给src。
    (2)第二行则是将src中的.c文件替换为.o文件。

  7. makefile中的make clean
    我们在make完后会生成一个可执行文件,当我们想要再执行make的时候需要将里面的可执行文件和.o文件删掉,每次在命令行rm很麻烦,所以可以把删除写在makefile里面。看代码来,手摸手教你写makefile_第5张图片
    解释:可以看到clean是一个目标,但是没有依赖,命令语句也不是为了生成目标。如果在命令行输入make,只会执行第一条规则的终极目标而不会执行clean。当你输入make clean时,makefile就会跳转到clean,执行rm操作。

你可能感兴趣的:(linux)