1 Makefile文件是什么
可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要先编译,那些文件需要后编译,那些文件需要重建等等。编译整个工程需要涉及到的,在 Makefile 中都可以进行描述。换句话说,Makefile 可以使得我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数。
# 例程所用文件的结构
-----Lieryang
|_________main.c
|_________main.h
|_________add.c
|_________minus.c
|_________Makefile
2 Makefile的工作流程
创建一个包含有多个源文件和Makefile的目录文件,源文件之间相互关联。在Makefile中添加下面代码:
main: main.o test1.o test2.o
gcc main.o test1.o test2.o -o main
main.o : main.c test.h
gcc -c main.c -o main.o
test1.o : test1.c test.h
gcc -c test1.c -o test1.o
test2.o : test2.c test.h
gcc -c test2.c -o test2.o
# targets:规则的目标,可以是Object File(一般称它为中间文件),也可以是可执行文件,还可以是标签。
# prerequisites:是我们的依赖文件,要生成targets需要的文件或者是目标。
# command 需要执行的命令(任意shell命令)
targets:prerequisites
command
:
左边是目标文件,右边是依赖文件。默认情况下make执行的是Makefile文件中的第一个规则(Makefile中出现的第一个依赖关系),此规则的第一目标称之为“最终目标”或者是“终极目标”。
3 清除工作目录中的过程文件
其中clean是一个目标,它是独立的,不会与第一个目标文件相关联,所以我们在执行make的时候也不会执行下面的命令。在shell中执行“make clean”命令,编译时的中间文件和生成的最终目标文件都会被清除,方便我们下次使用。
.PHONY:clean
clean:
rm -rf *.o main
4 变量的定义和使用
Makefile文件中定义变量的基本语法如下: 变量名称=值列表。调用变量的时候可以用" $(VALUE_LIST) " 或者 ${VALUE_LIST}。
OBJS=main.o add.o minus.o
TARG=test
$(TARG):$(OBJS)
gcc $(OBJS) -o $(TARG)
符合 | 含义 |
---|---|
简单赋值(:=) | 编程语言中常规理解的赋值方式,只对当前语句的变量有效 |
递归赋值(=) | 赋值语句可能影响多个变量,所有目标变量相关的其他变量都受影响 |
条件赋值(?=) | 如果变量未定义,则使用符号中的值定义变量(如果变量已赋值,则赋值语句无效) |
追加赋值(+=) | 原变量用空格隔开的方式追加一个新值 |
4.1 简单赋值
# Makefile
x:= foo
y:= $(x)b
x:= new
test:
@echo "y = $(y)"
@echo "x = $(x)"
输出结果
y = foob
x = new
4.2 递归赋值
x= foo
y= $(x)b
x= new
test:
@echo "y = $(y)"
@echo "x = $(x)"
输出结果
y = newb
x = new
4.3 条件赋值
x:= foo
y:= $(x)b
x?= new
test:
@echo "y = $(y)"
@echo "x = $(x)"
输出结果
y = foob
x = foo
4.4 追加赋值
x:= foo
y:= $(x)b
x+= $(y)
test:
@echo "y = $(y)"
@echo "x = $(x)"
输出结果
y = foob
x = foo foob