makefile

1.项目的目录结构:

makefile_第1张图片
常见c项目结构.png

2.makefile通用写法:

#获取当前目录下的src目录下的所有以.c结尾的文件名
src = $(wildcard ./src/*.c)
#把上面的文件改成在当前目录下的obj目录,同时文件结尾换成.o
obj = $(patsubst ./src/%.c,./obj/%.o,$(src))

#定义CC变量
CC = gcc
#定义最终生成的目标文件名
target = app
ALL = $(target)
# $^ :所有依赖,$<:第一个依赖,$@:目标
$(target):$(obj)
        $(CC) $^ -o $@

./obj/%.o:./src/%.c
        $(CC) -c $< -o $@ -I ./inc


clean:
        #在命令行之前使用“-”,意思是忽略命令 “rm”的执行错误
        -@rm -rf $(obj) $(target)
  # 使用 .PHONY 防止当前目录下有一个与clean或者ALL 同名的文件,导致 make clean 无法执行
.PHONY:clean ALL
  • wildcard : 函数获取指定目录下面的文件
  • patsubst: 替换文件名称
  • $^ : 全部依赖
  • $< : 第一个依赖
  • $@: 目标
  • 在命令行之前使用“-”,意思是忽略命令 命令执行 的执行错误
  • 在命令行之前使用“@”,意思是在执行时不显示当前命令
  • .PHONY : 无视文件是否存在,当 make 目标 时都会执行该目标,解决当前目录存在该目标,而是最新的,导致规则不执行。

你可能感兴趣的:(makefile)