makefile

参考文章:https://blog.csdn.net/qq_22182835/article/details/89467386

参考视频:https://www.bilibili.com/video/BV1dt411f7TZ?p=67

Makefile基本原则中的三要素
    目标:myCal
    依赖:add.c sub.c mul.c main.c
    命令:gcc add.c sub.c mul.c main.c -o myCal
    
    规则示例:(版本1)
    1.myCal:add.c sub.c mul.c main.c
    2.    gcc add.c sub.c mul.c main.c -o myCal
    (第二行为一个tab缩进)
    
    保存之后推出vi编辑,执行make命令,运行makefile文件生成终极目标
    
    直接从.c文件转换成可执行文件,如果其中一个.c文件需要修改,需要把所有的.c文件重新编译一遍,耗时太长
    考虑先将.c文件转换成.o文件,修改其中的对应.o文件即可。
    
    优化后如下:(版本2)
    1.myCal:add.o sub.o mul.o main.o
    2.    gcc add.o sub.o mul.o main.o -o myCal
    3.
    4.add.o:add.c
    5.    gcc -c add.c
    6.
    7.sub.o:sub.c
    8.    gcc -c sub.c
    ...
    
    规则模式:
    %:自动匹配所有依赖    
    makefile中的自动变量:
        $<:规则中的第一个依赖
        $@:规则中的目标
        $^:规则中的所有依赖
    自动变量只能在规则的命令中使用
    
    使用变量之后优化如下:(版本3)
    1.obj=add.o sub.o mul.o main.o【自定义变量--小写】
    2.target=myCal
    3.$(target):$(obj)
    4.    gcc $(obj) -o $(target)
    5.
    6.%.o:%.c
    7.    gcc -c $< -o $@【自动变量】
    
    makefile中有一些自己维护的变量
    CC
    CFLAGS
    
    makefile中函数的使用:(版本4)
    1.target=app.out
    2.src=$(wildcard ./*.c)
    3.obj=$(patsubst ./%.c, ./%.o, $(src))
    4.
    5.$(target):$(obj)
    6.    gcc $(obj) -o $(target)
    7.    
    8.%.o:%.c
    9.    gcc -c $< -o $@
    10.
    11..PHONY:clean【声明伪目标,使其不受更新时间影响,被touch之后仍然执行】
    12.clean:
    13.    rm $(obj) $(target) -f【-f强制执行,不会返回错误信息】
    
    在当前目录下可以执行 make clean来删除所有的.o文件和目标文件
    小细节:在makefile的命令前面加上-,当命令执行失败时可以忽略,继续向下执行
原文地址:https://www.cnblogs.com/zheaven/p/14102453.html