Makefile的原理
- Make是一个工程管理器,Make只编译更新过的文件
- Makefile是Make的唯一配置文件
- 有make工具创建的目标体(target),通常是目标文件或者可执行文件
- 要创建的目标所依赖的文件(dependencey_file)
- 创建每个目标体时需要运行的命令(command)
- 使用伪目标使clean总是执行
- 命令行前面必须是一个”TAB键”,否则编译错误为:***missing separator. Stop
例子
hello.o:hello.c hello.h
gcc -c hello.c -o hello.o
sunq:kang.o yul.o -o sunq
gcc kang.o yul.o -o sunq
kang.o:kang.c kang.h
gcc -Wall -O -g -c kang.c -o kang.o
yul.o:yul.c
gcc -Wall -O -g -c yul.c -o yul.o
-Wall:表示允许发出gcc所有有用的报警信息
-c:只是编译不链接,生成目标文件”.o”
-o file:表示把输出文件输出到file里
创建和使用变量
创建变量用来代替
- 系列文件的名字
- 传递给编译器的参数
- 需要运行的程序
- 需要查找源代码的目录
- 你需要输出信息的目录
- 你想要做的其他事情
定义方式
- VAR=var
- VAR:=var
变量使用$(VAR)
- 符号’$’用’$$’表示
- 类似于编程语言中的宏
- 用?=定义变量
自动变量:
符号 | 含义 |
---|---|
$* | 不包含扩展名的目标文件名称 |
$+ | 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件 |
$< | 第一个依赖文件的名称 |
$? | 所有时间戳比目标文件晚的依赖文件,并以空格分开 |
$@ | 目标文件的完整名称 |
$^ | 所有不重复的目标依赖文件,以空格分开 |
$% | 如果目标是归档成员,则该变量表示目标的归档成员名称 |
Makefile命令选项及隐含规则
make基础命令:
参数 | 含义 |
---|---|
-C | dir读入指定目录下的makefile |
-f | file读入当前目录下的file文件作为makefile |
-i | 忽略所有的命令执行错误 |
-I | dir指定被包含的makefile所在目录 |
-n | 只打印要执行的命令但不执行这些命令 |
-P | 显示make变量数据库和隐含规则 |
-s | 在执行命令时不显示命令 |
-w | 如果make在执行过程中改变目录,打印当前目录名 |
隐含规则
- 生成.o文件时自动编译.c文件
- 执行文件名与其中的某个.o文件名相同时,可以自动生成
VPATH及嵌套的Makefile
VPATH
工程项目中的源文件很可能不在同一个目录下,因此需要指明源文件路径;VPATH可以方便的指明所有引用路径,类似于配置环境变量
VPATH=src1 /home/huhu
嵌套的Makefile
外层makefile控制流程,内层makefile负责编译