一、make

  • gcc 编译器
  • make 是 Linux 自带的构建器

二、文件命名

  • makefile
  • Makefile

三、makefile 中的规则

例如:gcc a.c b.c c.c -o app

  • 规则由三部分组成:目标、依赖、命令

    app:a.c b.c c.c
        gcc a.c b.c c.c -o app
    
  • makefile 中可以有多条规则

四、makefile 优化

  1. 版本一:

    app:main.c add.c sub.c
            gcc main.c add.c sub.c -I ./ -o app
    

    存在的问题: 效率低,其中一个文件修改了,剩余的其它文件都要重新编译

  2. 版本二:

    app:main.o add.o sub.o
            gcc main.o add.o sub.o -I ./ -o app
    main.o:main.c
            gcc main.c -c -I ./
    add.o:add.c
            gcc add.c -c -I ./
    sub.o:sub.c
            gcc sub.c -c -I ./
    

    存在的问题: 冗余

  3. 版本三:

    • 自定义变量:obj=a.o b.o c.o
    • 自定义变量取值:tmp=$(obj)
    • makefile 自带的变量,一般都是大写的
    • 自动变量:只能在规则的命令中使用
      • $@:规则中的目标
      • $<:规则中的第一个依赖
      • $^:规则中的所有依赖
    obj = main.o add.o sub.o
    target = app
    $(target):$(obj)
        gcc $(obj) -o $(target) -I ./ 
    %.o:%.c
        gcc -c $< -o $@ -I ./
    
    obj = main.o add.o sub.o
    target = app
    $(target):$(obj)
        gcc $^ -o $@ -I ./ 
    %.o:%.c
        gcc -c $< -o $@ -I ./
    

    存在的问题: 可移植性比较差

  4. 版本四:(makefile 中的函数)

    • wildcard:查找指定目录下指定类型的文件
    • patsubst:匹配替换
    src = $(wildcard ./*.c)
    obj = $(patsubst %.c,%.o,$(src))
    target = app
    $(target):$(obj)
            gcc $^ -o $@ -I ./
    %.o:%.c
            gcc $< -c -I ./
    

    存在的问题: 不能自动清除

  5. 版本五:

    • make 目标名:让 make 执行非终极目标
    • clean::编写一个清理项目的规则(只有目标,没有依赖项)
    • -f:强制执行
    • .PHONY:clean:声明伪目标,避免同名文件干扰
    • -命令:忽略执行失败的命令,继续向下执行
    src = $(wildcard ./*.c)
    obj = $(patsubst %.c,%.o,$(src))
    target = app
    $(target):$(obj)
            gcc $^ -o $@ -I ./
    %.o:%.c
            gcc $< -c -I ./
    
    .PHONY:clean
    clean:
            -mkdir /abc
            -rm *.o $(target) -f