Makefile的编写

请注意,本文编写于 186 天前,最后修改于 186 天前,其中某些信息可能已经过时。

Makefile的编写

  1. Makefile的命名

    1. Makefile
    2. makefile
  2. Makefile的规则

    1. 规则中的三要素:目标,依赖,命令

      1. 目标:依赖条件
      2. 缩进 命令
    2. Makefile学习

      vim makefile
      app:main.c add.c sub.c mul.c

         gcc main.c add.c sub.c mul.c -o app

      :wq
      make

      
      2. ```makefile
      第二个版本 
      没有改变的代码文件则不需要编译,对命令拆分,分开编译
      首先去找依赖,如果在当前目录(或指定目录)找不到依赖文件,则向下查找对应依赖规则,执行命令,最后找到所有依赖,在执行生成最终目标(可执行文件)的命令
      app:main.o add.o sub.o mul.o
          gcc main.o add.o sub.o mul.o -o app
          
      main:main.o
          gcc -c main.c
          
      add.o:add.c
          gcc -c add.c
          
      mul.o:mul.c
          gcc -c mul.c
          
      sub.0:sub.c
          gcc -c sub.c
      1. Makefile工作原理

        1. 首先查找依赖

          1. 没有则生成
        2. 依赖文件的时间比较

          1. xx.o和xx.c的时间 xx.o的时间肯定要比xx.c要新 如果xx.c的时间比xx.o要新
          2. 说明文件修改过则重新运行gcc -c xx.c命令
        3. 生成最终目标的时候也是比较时间

          1. 可执行文件和各个依赖进行比较,依赖时间比app要新
          2. 说明可执行文件不是最新的,则需要执行生成可执行文件的命令
        4. 通过这种对比时间,只make新修改的文件,会大大提高程序编译的效率

      obj、targer自定义变量
      %.o:%.c 模式自动匹配
      $< 规则中的第一个依赖xx.o
      $@ 规则中的目标app

      obj=main.o add.o sub.o mul.o
      target=app
      $(target):$(obj)

         CC $(obj) -o $(target)
      

      %.o:%.c

         CC -c $< -o $@     
      
      5. ```makefile
      target=app
      src=$(wildcard ./*.c)
      obj=$(patsubst ./%.c, ./%.o, $(src))
      
      $(target):$(obj)
          $(CC) $(obj) -o $(target)
      
      %.o:%.c
          $(CC) -c $< -o $@
      
      .PHONY:clean                                                          clean:
          rm $(obj) $(target) -f
      
  3. Makefile的两个函数

    1. src=$(wildcard ./*.c) 会将指定目录下所有的.c文件名获取
    2. obj=$(patsubst ./%.c, ./%.o, $(src)) 会将所有.c文件替换成.o文件 .c文件从$(src)获取
    3. .PHONY:clean 伪目标 使用这个可以防止当前目录下有clean文件,与其对比,上面makefile中写的clean没有生成目标,根据对比之前所说的更新规则,每次比较当前目录中的clean都是最新的
    4. 在命令前加上- 如果失败忽略掉这条 则继续执行
  4. Makefile的三个自动变量

    1. $<: 规则中的第一个依赖
    2. $@: 规则中的目标
    3. ¥^: 规则中的所有依赖
    4. 只能在规则的命令中使用
    5. makefile 中自己维护的变量 一般大写

      1. CC gcc
      2. CPPFLAGS 预编译处理器需要的选项 如: -I
      3. CFLAGS 编译的时候使用的参数 -Wall -g -c
      4. LDFLAGS 链接库使用的选项 -L -l