Makefile

发布时间 2023-04-18 17:49:23作者: WTSRUVF

文件命名:

  makefile 或者 Makefile

Makefile规则

  一个Makefile文件中可以有一个或者多个规则
  目标...:依赖...

    命令(Shell命令)

    ...

  •   目标:最重要生成的文件(伪目标除外)
  •   依赖:生成目标所需要的文件或是目标
  •   命令:通过执行命令对依赖操作生成目标(命令前必须Tab缩进)

  Makefile中的其它规则一般都是为第一条规则服务的

 

 如果第一条规则所依赖的文件没有找到,则继续向下执行下面的规则,否则相应的规则不会执行

 

 在执行规则中的命令时,会比较目标和依赖文件的时间

  如果依赖的时间比目标的时间晚,需要重新生成目标

  如果依赖的时间比目标的时间早,目标不需要更新,对应规则中的命令不需要被执行

 变量

自定义变量

  变量名=变量值     var=hello

预定义变量

  AR:归档维护程序的名称,默认值为ar

  CC:C编译器的名称,默认值为CC

  CXX:C++编译器的名称,默认值为g++

  $@:目标的完整名称

  $<:第一个依赖文件的名称

  $^:所有的依赖文件

获取变量的值

  $(变量名)

应用

  

app:main.c a.c b.c
    gcc main.c a.c. b.c -o app
     等价于
//自动变量只能在规则的命令中使用
    $(CC) $^ -o $@

 

写很多.o: .c很费劲,使用模式匹配%

%.o: %.c
    // %:通配符,匹配一个字符串
    // 这两个%匹配的是同一个字符串

//因此上述中很多行的.o: .c可以写成一行
%.o: %.c
    gcc -c $^ -o $@

 

 

# 通过wildcard函数获取当前目录下所有的.c文件
# 可以写多个目录,用空格隔开
src = $(wildcard ./*.c)
# 通过patsubst函数将src字符串中的%.c替换成%.o
obj = $(patsubst %.c, %.o, $(src))

target = main
$(target): $(obj)
        gcc $^ -o $@
%.o: %.c
        gcc -c  $^ -o $@

# 用phony定义伪目标,不会与clean文件冲突
# 因为clean没有依赖文件所以只有使用make clean时才会执行
.PHONY:clean
clean:
        rm $(obj) -f