makefile 就是目标文件加上依赖文件
hello:main.o func1.o func2.o
gcc main.o func1.o func2.o -o hello
规则
targets (目标) :prerequisites(依赖)
command(命令)
.Makefile 由若干条的规则构成
.每个规则又是这样的:
targets (目标) :prerequisites(依赖)
command(命令)
rule1
rule2
rule3
在命令前加@就不会输出命令
例: @gcc …
伪目标没有依赖文件,不会在磁盘上建立文件只会执行命令
如: clean:
rm fun1.o fun2.o main.o hello
.PHONY:伪目标名
伪目标:
命令
为了防止当前文件夹下有同名的文件
变量定义 Mobj = main.o func1.o func2.o
$(变量名)用变量 gcc $(Mobj) -o hello
预定义变量:
AR 库文件维护程序的名称,默认值为ar
AS 汇编程序的名称,默认值为as
CC c编译器的名称,默认值为cc
CXX C++编译器名称,默认值为g++
ARFLAGS 库文件维护程序选项,无默认值
CFLAGS C编译器选项,无默认值
CXXFLAGS C++编译器选项,无默认值
例:CFLAGS = -g -c -WALL
CC = gcc
$(CC) $(CFLAGS) func2.c
//换编译器时只需改 变量CC的值
自动变量及环境变量
$* 不包含扩展名的目标文件名称
$< 第一个依赖文件名称
$@ 目标文件完整名称
$^ 所有不重复的依赖文件
例: hello:$(Mobj)
gcc $^ -o $@
make 工作流程
1、make会在当前目录下找名字叫”Makefile”或”makefile”的文件。
2、如果找到,它会找文件中的第一个目标文件(target)并把这个文件作为最终的目标文件
3、根据时间戳生成目标文件
4、递归去寻找目标文件依赖文件,并且递归生成(同样有时间戳问题)。
包含:
include 另一个Makefile文件名 联合编
嵌套
subsystem:
cd subdir &&gcc -c main.c
等价于:subsystem:
gcc -c main.c -C subdir
意思是先进入“subdir”目录,然后执行make
条件判断
ifeq( , )
命令
else
命令
endif
makefile 管理命令
-C dir 读入指定目录下面的makefile
-f file 读入当前目录下的file文件为makefile
-i 忽略所有命令执行错误
-I dir 指定被包含的makefile所在目录