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)