makefile的构成
makefile 由若干条的规则构成
规则:
(tatger)目标:prerequisites(依赖)
command(命令)
例子1:
hello:main.o func1.o func2.o
gcc main.o func1.o func2.o -o hello
例子2:
清除文件:
clean:
rm main.o func1.o func2.o
使用:
make clean
用户自定义变量
MObj=main.0 func1.o func2.o(类似于宏定义)
hello:$(MObj)
预定义变量
变量名 | 用法 |
---|---|
AR | 库文件维护程序的名称,默认值为ar |
AS | 汇编程序的名称,默认值为as |
CC | C编译器的名称,默认值为cc |
CXX | C++编译器的名称,默认值为g++; |
ARFKAGS | 库文件维护程序选项,无默认值 |
ASFFLAGS | 汇编程序选项,无默认值 |
CFLAGS | C编译器选项,无默认值 |
CXXFLAGS | C++编译器选项,无默认值 |
举例:
CFLAGS = -g -c
CC=gcc
$(CC) $(CFLAGS) func2.c(等价于 gcc -g -c func2.c)
自动变量及环境变量
变量名 | 用法 |
---|---|
$* | 不包含扩展名的目标文件名称 |
$* | 第一个依赖文件名称 |
$? | 所有时间戳比目标文件晚的依赖文件 |
$@ | 目标文件完整名称 |
$^ | 所有不重复的依赖文件 |
举例:
gcc $^ -o $@ (相当于gcc mian.0 func1.o func2.o -o hello)
make的工作流程
1、make会在当前目录下找名字叫"Makefile"或“makefle"的文件。
2、如果找到,它会找文件中的第一个目标文件(target) 并把这个文件作为最 终的目标文件。
3、根据时自戳生成目标文件。
4、递归去寻找目标文件依赖文件,并且递归生成(同样有时间戳问题)。
伪目标
用伪目标生成多个文件
all : prog1 prog2 prog3
.PHONY : allI
prog1 : prog1.0 utils.c
cc -0 prog1 prog1.0 utils.o
prog2 : prog2.0
cc -0 prog2 prog2.0
prog3 ; prog3.0 sort.o utils.o
包含:
include proc/makefile
嵌套:
subsystem:
cd subdir&&gcc -c main.c (等价于 gcc -c main.c -C subdir)
条件判断(不能按tab):
MObj=main.0 func1.o func2.o(类似于宏定义)
CC=gcc
hello:$ (MObj)
ifeq($ (CC),gcc)
$(CC) $^ -o $@
else
gcc $^ -o $@
endif
makefile管理命令
命令 | 用法 |
---|---|
-C dir | 读入指定目录下面的makefile |
-f file | 读入当前目录下的le文件为makeile |
-i | 忽略所有命令执行错误 |
-i dir | 指定被包含的makefile所在目录 |