make工程管理器的作用
通过读入makefile文件执行大量编译工作,可以:
- 减少编译工作量
- 提高效率
makefile的基本结构
- target
目标体:目标文件或者可执行文件 - dependency_file
创造目标体所需的依赖文件 - command
创建每个目标体时所需要运行的命令
基本格式为:
target : dependency_files
command/*这行必须以Tab开头*/
举例:
hello.o:hello.c
gcc -c hello.c -o hello
在命令行输入:
make hello.o
即可自动读入makefile文件,并执行对应target的command语句,并自动寻找依赖文件
makefile变量
变量是makefile中定义的名字,用来代替一个文本字符串
,该文本字符串称为变量值,可代替目标体、依赖文件、命令、其他部分。
变量的定义有两种方式: 递归展开式、简单方式
递归展开方式的定义格式为: VAR = var
,可以嵌套引用但是会出现无穷循环的情况比如:
CFLAGS= $(CFLAGS) -O
简单扩展方式为: VAR:=var
,不能嵌套引用 。
举例:下面是一个makefile文件
david:kang.o yul.o
gcc kang.o yul.o -o myprog
kang.o:kang.c kang.h head.h
gcc -Wall -O -g -c kang.c -o kang.o
yul.o:yul.c head.h
gcc -Wall -O -g -c yul.c -o yul.o
现在使用变量改写这个文件
OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g
david:$(OBJS)
$(CC) $(OBJS) -o david
kang.o:kang.c kang.h head.h
$(CC) $(CFLAGS) -c kang.c -o kang.o
yul.o:yul.c head.h
$(CC) $(CFLAGS) -c yul.c -o yul.o
改写文件中的OBJS
是用户的自定义变量,CC
与CFLAGS
是预定义变量,常见的预定义变量有:
AR
库文件维护程序的名称,默认值为arAS
汇编程序的名称,默认值为asCC
C编译器的名称,默认值为ccCPP
C预编译器的名称,默认值为ccCXX
c++编译器的名称,默认值为g++RM
文件删除程序的名称,默认值为rm -fARFLAGS
库文件维护程序选项,无默认值ASFLAGS
汇编程序的选项,无默认值CFLAGS
c编译器的选项,无默认值CPPFLAGS
c预编译器的选项,无默认值CXXFLAGS
c++编译器的选项,无默认值FFLAGS
Fortran编译器的选项,无默认值
为了进一步简化makefile编写还引入了自动变量,可以代表目标文件和依赖文件,常见的自动变量有:
$*
不含扩展名的目标文件名称$+
所有依赖文件以空格分开,以出现的先后为顺序$<
第一个依赖文件的名称$?
所有时间戳比目标文件晚的依赖文件$@
目标文件的完整名称$^
所有不重复的依赖文件$%
如果目标是归档成员,则表示归档成员的名称
下面使用自动变量改写以下makefile文件
david:kang.o yul.o
gcc kang.o yul.o -o myprog
kang.o:kang.c kang.h head.h
gcc -Wall -O -g -c kang.c -o kang.o
yul.o:yul.c head.h
gcc -Wall -O -g -c yul.c -o yul.o
改写后:
OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g
david:$(OBJS)
$(CC) $^ -o $@
kang.o:kang.c kang.h head.h
gcc $(CFLAGS) -c $< -o $@
yul.o:yul.c head.h
gcc $(CFLAGS) -c $< -o $@
make管理器使用
只需要在make命令后键入指定目标名,即可建立指定的目标,直接运行make则建立第一个目标
常用的make命令行选项
- -C dir
读入指定目录下的makefile - -f file
读入当前目录下的file文件作为makefile - -i
忽略所有命令的执行错误 - -I dir
指定被包含的makefile所在目录