文章目录
前言
Make简介
Makefile基本结构
Makefile格式
make的clean——伪目标:
Make变量
创建和使用变量
变量定义的方式
预定义变量
自动变量
环境变量
Make命令选项和隐含规则
Make使用
Makefile隐含规则
VPATH用法和Makefile嵌套
VPATH : 虚路径
Makefile的嵌套
写在最后
Make简介
Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作 。
工程管理器,顾名思义,是指管理较多的文件
Make将只编译改动的代码文件(根据时间戳),而不用完全编译。
Makefile基本结构
Makefile是Make读入的唯一配置文件 。
由make工具创建的目标体(target),通常是目标文件或可执行文件。
要创建的目标体所依赖的文件(dependency_file)
创建每个目标体时需要运行的命令(command)
命令行前面必须是一个”TAB键”,否则编译错误为:* missing separator. Stop.**
Makefile格式
target : dependency_files <TAB> command
例子:
hello.o : hello.c hello.h gcc –c hello.c –o hello.o
稍微复杂一些的例子:
sunq:kang.o yul.o gcc kang.o yul.o -o sunq kang.o : kang.c kang.h gcc –Wall –O -g –c kang.c -o kang.o yul.o : yul.c gcc - Wall –O -g –c yul.c -o yul.o 1
回顾一下之前的内容:
-Wall:表示允许发出gcc所有有用的报警信息.
-c:只是编译不链接,生成目标文件”.o”
-o file:表示把输出文件输出到file里
make的clean——伪目标:
这样每次make clean都会无条件执行,而不会因为文件下有同名文件而不执行。
.PHONY:clean clean: rm *.o test
Make变量
创建和使用变量
创建变量的目的:
用来代替一个文本字符串:
系列文件的名字
传递给编译器的参数
需要运行的程序
需要查找源代码的目录
你需要输出信息的目录
你想做的其它事情。
变量定义的方式
递归展开方式VAR=var
简单方式 VAR:=var
变量使用$(VAR)
递归展开方式VAR=var
OBJS = kang.o yul.o CC = gcc CFLAGS = -Wall -O -g sunq : $(OBJS) $(CC) $(OBJS) -o sunq kang.o : kang.c kang.h $(CC) $(CFLAGS) -c kang.c -o kang.o yul.o : yul.c yul.h $(CC) $(CFLAGS) -c yul.c -o yul.o
优点:它可以向后引用变量
缺点:不能对该变量进行任何扩展,例如 CFLAGS = $(CFLAGS) -O会造成死循环
简单方式 VAR:=var
m := mm x := $(m) y := $(x) bar x := later echo $(x) $(y)
非常类似于C语言的变量表示方式,这种定义变量的方式更适合在大的编程项目中使用,因为它更像我们一般的编程语言
用?=定义变量
FOO ?= bar
条件定义:如果变量存在不做调整,如果不存在就定义对应的值为bar等价于:
ifeq ($(origin FOO), undefined) FOO = bar endif
为变量添加值
可以通过+=为已定义的变量添加新的值
Main=hello.o hello-1.o Main+=hello-2.o
预定义变量
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编译器的选项,无默认值。
自动变量
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能 包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的的依赖文件,并以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的目标依赖文件,以空格分开
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
环境变量
make在启动时会自动读取系统当前已经定义了的环境变量,并且会创建与之具有相同名称和数值的变量
如果用户在Makefile中定义了相同名称的变量,那么用户自定义变量将会覆盖同名的环境变量