案列一
edit:main.o display.o insert.o files.o utils.o
gcc -o edit main.o display.o insert.o files.o utils.o
main.o: main.c main.h
gcc -c main.c -o main.o
display.o: display.c display.h
gcc -c display.c -o display.o
insert.o: insert.c insert.h
gcc -c insert.c -o insert.o
files.o: files.c files.h
gcc -c files.c -o files.o
utils.o: utils.c utils.h
gcc -c files.c -o files.o
clean: rm edit main.o display.o insert.o files.o utils.o
输入命令make
,就可以生成可执行文件edit
和中间目标文件*.o
,clean
不是动作名称,不是文件,是标签,不依赖其他任何文件。
Makefile变量
变量可以代替目标文件,依赖文件,命令和其他部分。
变量定义有两种方式:递归展开方式,简单展开方式。
递归展开方式:VAR=var
简单扩展方式:VAR:=var
简单展开只能展开一次。
变量使用格式:$(VAR)
自定义变量
预定义变量
格式 | 含义 |
---|---|
AR | 汇编程序的名称,默认值为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编译器的选项,无默认值 |
自动变量
格式 | 含义 |
---|---|
$* | 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件 |
$< | 第一个依赖文件的名称 |
$? | 所有时间戳比目标文件晚的依赖文件,并以空格分开 |
$@ | 目标文件的完整名称 |
$^ | 所有不重复的依赖文件,以空格分开 |
$% | 如果目标是归档成员,则该变量表示目标的归档成员名称 |
案例 |
OBJS=main.o display.o insert.o files.o utils.o
CC=gcc
CFLAGS=-Wall -O -g
edit:$(OBJS)
$(CC) $^ -o $@
main.o: main.c main.h
$(CC) $(CFLAGS) -c $< -o $@
display.o: display.c display.h
$(CC) $(CFLAGS) -c $< -o $@
insert.o: insert.c insert.h
$(CC) $(CFLAGS) -c $< -o $@
files.o: files.c files.h
$(CC) $(CFLAGS) -c $< -o $@
utils.o: utils.c utils.h
$(CC) $(CFLAGS) -c $< -o $@
clean: rm edit $(OBJS)
Makefile规则
1、隐形规则
所有的.o
文件都可以自动由.c
文件使用命令$(CC) $(CPPFLAGS)$(CFLAGS) -c file.c -o file.o
生成。
只能查找相同文件名,不同后缀名的文件,如kang.o
文件必须由kang.c
文件生成。
所以上面的案例中,命令$(CC) $(CFLAGS) -c $< -o $@
可以省去。
OBJS=main.o display.o insert.o files.o utils.o
CC=gcc
CFLAGS=-Wall -O -g
edit:$(OBJS)
$(CC) $^ -o $@
main.o: main.c main.h
display.o: display.c display.h
insert.o: insert.c insert.h
files.o: files.c files.h
utils.o: utils.c utils.h
clean: rm edit $(OBJS)
2、模式规则
能引入用户自定义变量,为多个文件建立相同的规则,简化Makefile的编写。
相关文件,必须用%
标明。