makefile

简述makefile

  • makefile是一个文件,里面放的是编译的规则,可以管理多个文件

  • make是一个工具,用来解析我们的makefile

  • make会根据文件的时间戳进行编译,如果文件的时间戳没有改变,则不会编译文件

  • makefile的逻辑

    • 目标文件:依赖文件

      ​ (tab) 编译语句

      目标文件就是我们最终生成的文件,要生成这个文件,会去找生成它需要的文件,就叫做依赖文件,如果依赖文件又需要其他的文件来生成,继续找它的依赖文件,直到不需要为止

 app:list.o main.o
     gcc  list.o main.o -o app
 list.o:list.c
    gcc -c list.c -o list.o
 main.o:main.c
     gcc -c main.c -o main.o
 clean:
     rm main.o list.o app 
  • make clean 删除生成的文件(执行clean后面的语句)

  • 执行:make,默认解析当前目录下的makefile或者Makefile

  • 选项

    • -f ---- 编译指定的makefile文件

    • -I(大写的i) ---- 调用外部头文件 加头文件的路径

 1 app:list.o main.o
     gcc  list.o main.o -I ./include -o app
 list.o:list.c
    gcc -c list.c -I ./include -o list.o
 main.o:main.c
     gcc -c main.c -I ./include -o main.o
 clean:
     rm main.o list.o app 

makefile的变量

变量的赋值:

  • =:给当前变量赋值,但是如果后面有新的赋值,把新的赋值给变量
a=12
 b=$(a)
 a=34
 all:
    @echo $(b)
输出:b=34
  • :=—立即赋值,和平时的赋值一样,后面新的赋值不会改变当前值
a=12
 b:=$(a)
 a=34
 all:
     @echo $(b)
 输出:b=12
  • ?=—询问赋值,询问前面有没有赋值,如果有,此次赋值无效
 a=12
 b:=$(a)
a?=34
 all:
     @echo $(b)
     echo $(a)
a=12
  • +=:追加赋值
a=12
 b:=$(a)
 a+=hello
 all:
     @echo $(b)
     echo $(a)
a=12 hello
  • 可以在语句前加@隐藏显示语句

  • 利用变量写makefile:

 TARGET=app
 OBJS=list.o main.o
 CC=gcc
 OBJS2=list.c
 OBJS3=main.c
 PATH=-I ./include
$(TARGET):$(OBJS)
     $(CC)  $(OBJS) $(PATH) -o $(TARGET)
 list.o:$(OBJS2)
    $(CC) -c $(OBJS2) $(PATH) -o list.o
 main.o:$(OBJS3)
     $(CC) -c $(OBJS3) $(PATH) -o main.o
 clean:
     rm $(OBJS) $(TARGET)                             
  • 特殊的变量:
    • $@—目标文件
    • $^—所有依赖文件
    • $<:第一个依赖文件
    • 通配符:%
TARGET=app
OBJS=list.o main.o
CC=gcc
OBJS2=list.c
OBJS3=main.c
path=-I ./include
 $(TARGET):$(OBJS)
     $(CC)  $^ $(path) -o $@
 %.o:%.c
     $(CC) -c $^ $(path) -o $@
 clean:
     rm $(TARGET) $(OBJS)