makefile写法

makefile写法

规则

三要素:

  • 目标
  • 依赖
  • 命令

语法:
目标:依赖条件
命令

例子:

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

改进:

  • 只是编译修改的部分,是把编译和链接分开执行

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

工作原理:

  • 默认只生成第一条规则
  • 所以需要把最终的生成目标写在第一条
  • 更新源文件时,会比较目标和依赖的时间关系,如果依赖比目标还晚,就会重新执行命令,
  • 其中一个更新,会导致其他依赖此目标的规则进行执行,最终导致最终的目标被更新

变量:

  • $< : 规则中第一个依赖
  • $@ : 规则中的目标
  • $^ : 规则中所有的依赖
  • 以上三个只能在命令中写
  • % : 模式规则,会做替换,比如用main,add来替换
  • CC : 系统维护的变量 CC = cc = gcc
  • CPPFLAGS : 预编译(头文件展开,宏替换,去掉注释)的选项
  • CFLAG : 编译时的选项 -L -g
  • 全大写是内部维护变量
        app:main.o add.o sub.o mul.o
            gcc main.o add.o sub.o mul.o -o app
            等价于 gcc $^ -o $@
        obj=main.o add.o sub.o mul.o
        target=app
        CC = gcc
        $(target):$(obj)
            $(CC) $(obj) -o $(target)

        %.o:%.c
            $(CC) -c $< -o $@

函数:

  • 一定有返回值
    obj=main.o add.o sub.o mul.o
    target=app
    #获取所有.c文件的函数wildcard,用$获取返回值
    src=$(wildcard ./*.c)
    #把所有的.c替换成.o
    obj=$(patsubst ./%.c, ./%.o, $(src))
    CC = gcc
    $(target):$(obj)
        $(CC) $(obj) -o $(target)

    %.o:%.c
        $(CC) -c $< -o $@
    obj=main.o add.o sub.o mul.o
    target=app
    #获取所有.c文件的函数wildcard,用$获取返回值
    src=$(wildcard ./*.c)
    #把所有的.c替换成.o
    obj=$(patsubst ./%.c, ./%.o, $(src))
    CC = gcc
    $(target):$(obj)
        $(CC) $(obj) -o $(target)

    %.o:%.c
        $(CC) -c $< -o $@

    #伪目标,不会进行更新时间的比较,防止在文件夹下有clean文件,导致clean无法执行
    .PHONYLclaen
    clean:
        #命令前面加上-意思是命令执行错误也继续执行
        -mkdir /aa
        rm $(obj) $(target)

你可能感兴趣的:(makefile写法)