C++ Makefile文件详解

2022-07-10 14:08:27

什么是Makefile文件

  • 一个工程,源文件不计其数,按照类型、功能、模块分别放在对应的若干个目录中
  • Makefile定义了一系列的规则,比如定义文件编译的先后顺序。类似shell脚本,也可以执行操作系统的命令
  • Makefile带来的好处是自动化编译
  • 文件的命名 makefile 或者 Makefile
  • Makefile规则 :其可以定义一个或者多个 规则
  • 目标 ... :  依赖  ...
    • 命令 (shell 命令)
  • 目标:最终要生成的文件 (伪目标除外)
  • 依赖:生成目标所需要的文件或者是目标
  • 命令:通过执行命令对依赖生成目标 (命令之前使用 Tab进行缩进)

工作原理

  • 命令在执行之前,需要检查规则中依赖是否存在
    • 如果存在:执行命令
    • 如果不存在:向下检查其他的规则,检查有没有一个规则是用来生成这个依赖的,如果找到,就执行规则中的命令
  • 检测更新,在执行规则中的命令时,会比较目标和依赖文件的时间
    • 如果依赖的时间比目标时间晚,需要重新生成目标
    • 如果依赖的时间比目标时间早,目标不需要更新,对应规则中的命令不需要被执行
app:sub.o add.o mult.o main.o
    gcc sub.o add.o mult.o main.o

sub.o:sub.c
    gcc -c sub.c -o sub.o

add.o:add.c
    gcc -c add.c -o add.o

mult.o:mult.c
    gcc -c mult.c -o mult.o

main.o:main.c
    gcc -c main.c -o main.o

 内容详解

  • 自定义变量
    • 变量名 = 变量值  var = hello
  • 预定义变量
    • AR:  归档维护程序的名称 默认数值为 ar
    • CC:C 编译器的名称 默认数值为cc
    • CXX:C++编译器的名称 默认数值为g++
    • $@:目标的完整路径
    • $<: 第一个依赖的文件的名称
    • $^ :所有的依赖文件的
  • 获取变量的数值
    • $(变量名字)
app:mian.c a.c b.c
    gcc -c main.c a.c b.c
    
app:main.c a.c b.c
    $(CC) -c $^ -o $@
  • 模式匹配
app:sub.o add.o mult.o main.o
    gcc sub.o add.o mult.o main.o

sub.o:sub.c
    gcc -c sub.c -o sub.o

add.o:add.c
    gcc -c add.c -o add.o

mult.o:mult.c
    gcc -c mult.c -o mult.o

main.o:main.c
    gcc -c main.c -o main.o

模式匹配

%.o:%.c
    % 通配符,匹配一个字符串
%.o:%.c
    gcc -c $< -o $@

函数

(wildcard PATTERN)

  • 功能:获取指定目录下指定类型的文件列表
  • 参数:PATTERN 指的是某个或者多个目录下的对应的某种类型的文件,如果有多个目录,一般使用空格进行间隔
  • 返回:得到的若干个文件的文件列表 文件名字之间使用空格进行间隔

例子

$(wildcard *.c ./sub/*.c)
    返回数值的格式:a.c b.c d.c e.c f.c

$(patsubst <pattern>,<replacement>,<text>)

  •  功能:查找<text>中的单词(单词以“空格”、“Tab”或者"回车"、"换行"分隔)是否符合模式<pattern>,如果匹配的话,则用<replacement>替代
  • <pattern> 可以包括通配符"%" 表示任意长度的子串。如果<replacement>中 也包含“%s”,那么<replacement>中的这个'%',将是<pattern>中的%所代表的子串
  • 使用'\'进行转义 ,即 \%表示真实含义的%字符

例子

$(patsubst %.c , %.o , x.c bar.c)
    返回数值的类型 x.o bar.o

删除 所有的.o 文件

  •  使用命令 make clean 手动清除文件
.PHONY:clean   //将clean作为伪目标,就不会生成clean文件
clean:
    rm $(objs) -f

CMakeLists.txt文件的参考链接

  • 作者:MY CUP OF TEA
  • 原文链接:https://blog.csdn.net/CHYabc123456hh/article/details/115869775
    更新时间:2022-07-10 14:08:27