3.makefile运行流程
3.1 make和makefile
makefile文件主要包含了5部分内容:
- 显式规则
- 说明了如何生成一个或多个目标文件。由makefile文件的创作者指出,包括要生成的文件、文件的依赖文件、生成的命令。
- 隐式规则
- 由于make有自动推导的功能,所以隐式规则可以比较粗糙的简略属性makefile文件,这是由make所支持的。
- 变量定义
- 在makefile文件中定义一系列的变量,变量一般都是字符串,这与C语言中的宏定义类似。其中的变量都会扩展到相应的引用位置上。
- 文件指示
- 在一个makefile文件中引用另一个makefile文件
- 根据某些情况指定makefile文件中的有效部分
- 定义一个多行命令
- 注释
- #
3.2 系统自带变量 —— $@ $^
3.2.1 makefile中常见预定义变量
命令格式 |
含义 |
AR |
库文件维护程序的名称,默认为ar |
AS |
汇编程序的名称,默认为as |
CC |
C编译器的名称,默认为cc |
CPP |
C预编译器的名称,默认为$(CC)-E |
CXX |
C++编译器的名称,默认值为g++ |
FC |
FORTRAN编译器名称,默认值为f77 |
RM |
文件删除程序的名称,默认值为rm-f |
ARFLAGS |
库文件维护程序的选项,无默认值 |
ASFLAGS |
汇编程序的选项,无默认值 |
CFLAGS |
C编译器的选项,无默认值 |
CPPFLAGS |
C预编译器的选项,无默认值 |
CXXFLAGS |
C编译器的选项,无默认值 |
FFLAGS |
FORTRAN编译器的选项,无默认值 |
$* |
不包含扩展名的目标文件名称 |
$+ |
所有依赖文件,以出现的先后排序,(可能重复) |
$< |
第一个依赖文件的名称 |
$? |
所有时间戳比目标文件晚的依赖文件 |
$@ |
目标文件的完整名称 |
$^ |
所有不重复的依赖文件 |
$% |
若目标是归档成员,该变量表示目标的归档成员名称 |
3.2.2 引入变量,改写makefile
<first_make.c>
<head.h>
<makefile>
改写后
<makefile>
3.3 make传递变量 —— CC
3.4 手动定义变量 —— 传递target
<makefile>
3.5 自动推理参数设置 —— CFLAGS
当 head.h 头文件在其他位置是,需要-I加上头文件的目录,对应变量名称为CFLAGS
<makefile>
3.6 make clean
伪目标:clean,用.PHONY来标注,这样即使存在文件名为clean,也会执行清理操作。
执行 make 时,为什么 make clean不执行,因为clean没有依赖文件,它本身就是最新的,所以不执行。
<makefile>