概述
Make是一个工具程序,它是一种转换文件形式的工具,主要依赖文件的修改时间进行判断(时间戳),来执行编译已修改的源代码。可以有效提高我们的编译效率。其基本概念有三个:目标(Target)、依赖(Dependency)、规则(Rule)。目标就是我们要生成的文件,依赖就是达成目标所需要的文件,规则就是我们具体要实现的语句。
举个简单的例子:
我们想要一个test的可执行文件,我们的依赖就是test.c文件,规则就是gcc test.c -o test -Wall
Target:Dependency
Rule
test:test.c
gcc test.c -o test -Wall
基本规则
基本规则1:基本格式如下:
test:test.c
gcc test.c -o test -Wall
基本规则2:Makefile可以定义多个目标。运行时使用命令
make 目标 来实现目标。如果不指定目标,默认第一个目标。
代码如下:
基本规则3:依赖文件必须先满足或先构建
基本规则4:一个规则可以有多个目标
基本规则5:一个目标可以有多个命令
Make 假目标(处理所定义目标与已存在文件同名的的情况)
使用方法:
在文件开头使用.PHONY:目标
代码如下:
.PHONY:test3
test :test.c
gcc test.c -o test -Wall
gcc test1.c -o test1 -Wall
test3:
rm test test1
Makefile 变量
作用:方便使用,简洁,更具可维护性
定义:名字 = 值
CC = gcc
变量的引用:$ (变量名) 或 ${变量名} 和shell一样
自动变量
- $@用于表示一个规则中的目标。当一个规则中有多个目标时, $@指的是其中任何造成命令被运行的的目标
- $^表示规则中的所有依赖条件
- $<第一个依赖条件
.PHONY:clean
CC = gcc
RM = rm
OBJ = test
OBJS = main.o foo.o
$(OBJ):$(OBJS)
$(CC) -o $@ $^
main.o:main.c
$(CC) -c $^ -o $@
foo.o:foo.c
$(CC) -c $^ -o $@
clean:
@$(RM) $(OBJS) $(OBJ)
预定义变量
AS 汇编程序的名称,默认值为 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 编译器的选项,无默认值
命令格式 | 含义 |
---|---|
AR | 库文件维护程序的名称,默认值为 ar |
AS | 汇编程序的名称,默认值为 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 编译器的选项,无默认值 |