makefile基本规则

一.格式:

Target : Dependencies…

Command…

这即为一个规则,其中:

  1. Target 为目标,是规则的名字,也是make命令的入口.

    Target可以是目标文件—main.o main等等

    也可以是伪目标—并非真正要生成的文件,而是一个标签,不要和实际要生成的文件同名,一般为一个有意义的名字,可以描述其下Command命令功能的名字

    Target中一般只有一个文件;多个文件用空格分开,但是必须为相同类型的文件

  2. Dependencies为依赖文件列表

    例如main依赖main.o和hello.o,即为:

    main:main.o hello.o

    如果依赖文件一个都不写的话,那么只要输入make命令command命令就会执行

    一般都将生成可执行文件的规则放在第一个,如下(?):

    image-20230729190209136

    如果不想将命令显示出来,在每条Command命令前都加上@即可:

image-20230729190236956

二.自动化变量

  1. 每一条规则都有互不冲突的变量:
$< 规则的第一个依赖文件名
$^ 规则的所有依赖文件列表
$@ 规则的目标文件名

使用自动化变量可以简化规则的书写,例如:

image-20230729190322189

注意:自动化变量只能用于Command中,不能用于每个规则的第一行

  1. 可以定义变量替代一系列文件名:

targets=main.o add.o sub.o

该变量相当于全局变量,可以用在任何出现main.o add.o sub.o的地方

但是使用的时候写法为$(targets)而不能直接使用targets

一般只需要定义如下变量放于开头:

image-20230729190425899

分别为:最后可执行文件的变量;生成该可执行文件所需要的所有.o文件的变量;所有头文件的变量

makefile的简化

一.%.o:%.c

观察下面规则:

image-20230729190520197

可以使用

%.o:%.c

gcc -c $< -o $@

来简化

%.o代表所有的.o文件,%.c代表所有的.c文件

注意:尽管写在了一起,但是仍然是"只有发生改变的文件以及与该文件有依赖关系的文件才会重新编译"

makefile隐含规则

隐含规则是系统在makefile中已经写好的,隐含的一些规则

  1. 将.c文件编译生成.o文件

make会自动推导出这种规则,并生成.o文件

所以前面的规则可以写成:

image-20230729190606717

存在多个makefile文件时执行哪一个

  1. make命令能够找到的makeflie文件只能是makefile或Makefile

其他名字需要使用-f参数,例如:

make -f makefile1

make clean -f makefile1

image-20230729190646494