1. Make简介
- 工程管理器,顾名思义,是指管理较多的文件
- Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指他能根据文件时间戳自动发现更新过的文件而减少编译工作量,同时,他通过读入Makefile文件的内容来执行大量的编译工作
- Make将只编译改动的代码,而不是完全编译
2. Makefile基本结构
- Makefile是Make读入的唯一配置文件
- 由make工具创建的目标体(target),通常是目标文件或可执行文件
- 要创建的目标体所依赖的文件(dependency_file)
- 创建每个目标体时需要运行的命令(command)
- 注意:命令行前面必须是一个TAB键,否则编译错误
- 用法:新建一个
Makefile
文档,完成后在终端make
一下就编译好了
target: dependency_files
command
- 例1:
hello.o: hello.c hello.h
gcc -c hello.c -o hello.o
- 例2:
test: f1.o f2.o main.o
gcc f1.o f2.o main.o -o test
f1.o: f1.c
gcc -c f1.c -o f1.o
f2.o: f2.c
gcc -c f2.o -o f2.o
main.o: main.c -o main.o
gcc -c main.c -o main.o
- 如果想要删除生成相关的
*.o
文件可以用clear
,见下面这个例子,在终端输入make clear
就好了
test: f1.o f2.o main.o
gcc f1.o f2.o main.o -o test
f1.o: f1.c
gcc -c f1.c -o f1.o
f2.o: f2.c
gcc -c f2.o -o f2.o
main.o: main.c -o main.o
gcc -c main.c -o main.o
PHONY: clean
rm *.o test
3. 创建和使用变量
-
定义变量的两种方式
:=
:直接赋值,常规赋值方式,一赋值马上有效。在没赋值是为空字符。?=
:仅仅在变量还没赋值的情况下才有效,所有一般用在第一次赋值+=
:在变量后加上字符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