makefile的使用
makefile基本规则
一.格式:
Target : Dependencies…
Command…
这即为一个规则,其中:
-
Target 为目标,是规则的名字,也是make命令的入口.
Target可以是目标文件—main.o main等等
也可以是伪目标—并非真正要生成的文件,而是一个标签,不要和实际要生成的文件同名,一般为一个有意义的名字,可以描述其下Command命令功能的名字
Target中一般只有一个文件;多个文件用空格分开,但是必须为相同类型的文件
-
Dependencies为依赖文件列表
例如main依赖main.o和hello.o,即为:
main:main.o hello.o
如果依赖文件一个都不写的话,那么只要输入make命令command命令就会执行
一般都将生成可执行文件的规则放在第一个,如下(?):
如果不想将命令显示出来,在每条Command命令前都加上@即可:
二.自动化变量
- 每一条规则都有互不冲突的变量:
$< | 规则的第一个依赖文件名 |
---|---|
$^ | 规则的所有依赖文件列表 |
$@ | 规则的目标文件名 |
使用自动化变量可以简化规则的书写,例如:
注意:自动化变量只能用于Command中,不能用于每个规则的第一行
- 可以定义变量替代一系列文件名:
targets=main.o add.o sub.o
该变量相当于全局变量,可以用在任何出现main.o add.o sub.o的地方
但是使用的时候写法为$(targets)而不能直接使用targets
一般只需要定义如下变量放于开头:
分别为:最后可执行文件的变量;生成该可执行文件所需要的所有.o文件的变量;所有头文件的变量
makefile的简化
一.%.o:%.c
观察下面规则:
可以使用
%.o:%.c
gcc -c $< -o $@
来简化
%.o代表所有的.o文件,%.c代表所有的.c文件
注意:尽管写在了一起,但是仍然是"只有发生改变的文件以及与该文件有依赖关系的文件才会重新编译"
makefile隐含规则
隐含规则是系统在makefile中已经写好的,隐含的一些规则
- 将.c文件编译生成.o文件
make会自动推导出这种规则,并生成.o文件
所以前面的规则可以写成:
存在多个makefile文件时执行哪一个
- make命令能够找到的makeflie文件只能是makefile或Makefile
其他名字需要使用-f参数,例如:
make -f makefile1
make clean -f makefile1