Make 工程管理器也就是个"自动编译管理器",这里的"自动"
是指它能够根据文件时间戳,发现更新过的文件而减少编译工作量同时它通过读入
Makefile 文件的内容来执行大量的编译工作
当项目中包含了多个.c文件,但只对其中一个文件进行了修改,那用 gcc 编译会将所有的文件从头到尾编译一遍,这样的效率非常低
所以通过 make 工具,可以查找到修改过的文件(根据时间戳),只对修改过的文件进行编译,这样大大减小了编译的时间,提高编译效率
Makefile是工程文本文件
格式:
目标:依赖
Makefile 根据以下步骤编写:
gcc xx.o -o xx
gcc -c xxx.c -o xx.o
例如:写一个Makefile文件
- main: main.o add.o
- gcc main.o add.o -o main
- main.o: main.c
- gcc -c main.c -o main.o
- add.o: add.c
- gcc -c add.c -o add.o
目标: 伪命令
伪命令它的目的不是创建目标文件,而是执行下面的命令
- #第一个版本
- main: main.o add.o
- gcc main.o add.o -o main
- main.o: main.c
- gcc -c main.c -o main.o
- add.o: add.c
- gcc -c add.c -o add.o
-
- .PHONY: clean #.PHONY 告诉电脑clean不是文件
- clean:
- rm -rf *.o main
-
执行:make clean
规则中 rm 命令不是为了创建 clean 这个文件而是执行删除命令。当工作目录中不存在clean 命名文件时,执行 make clean 命令 rm -rf *.o main总会被执行。
如果避免同名文件加 .PHONY:伪命令

自己定义的变量:一般用大写表示变量名,取变量值用 $(变量名)
1) = 递归方式展开
- VAR=hello
- SUM=$(VAR) world # 递归展开,后面 VAR 改变 SUM 也会跟着变
- VAR=123

2) := 直接赋值(当前的值是什么就立即赋值)

3) += 追加新的值

4) ?= 判断之前是否定义,如果定义了,不重新赋值,否则赋值
- VAR=hello
- SUM:=$(VAR) world # 直接赋值,后面 VAR 改变 SUM 不会跟着变
- VAR=123
-
- SUM+=456 #在后面追加上新的值
-
- SUM?=789 #进行判断,判断之前死否定义,如果定义不能重新赋值,否则赋值
-
- all:
- echo $(VAR)
- echo $(SUM)
系统预定义好的一些变量,可能有默认值也可能没有
RM 文件删除程序的名称,默认值为 rm -f
CC C编译器的名称,默认值为cc
CPP C预编译的名称,默认值为$(CC) -E
CFLAGS C编译器的选项,无默认值
OBJS 生成的二进制文件或目标文件,自己定义
- #第二个版本
- CC=gcc
- CFLAGS=-c -g -Wall #-c编译 -g加调试 -Wall显示警告
- OBJS=main.o add.o
-
- main: $(OBJS)
- $(CC) $(OBJS) -o main
- main.o: main.c
- $(CC) $(CFLAGS) main.c -o main.o
- add.o: add.c
- $(CC) $(CFLAGS) add.c -o add.o
-
- .PHONY: clean
- clean:
- $(RM) *.o main
$< 第一个依赖文件的名称
$@ 目标文件的完整名称
$^ 所有不重复的依赖文件,以空格分开
- #第三个版本
- CC=gcc
- CFLAGS=-c -g -Wall #-c编译 -g加调试 -Wall显示警告
- OBJS=main.o add.o
-
- main: $(OBJS)
- $(CC) $^ -o $@
- main.o: main.c
- $(CC) $(CFLAGS) $< -o $@
- add.o: add.c
- $(CC) $(CFLAGS) $< -o $@
-
- .PHONY: clean
- clean:
- $(RM) *.o main
-
- #第四个版本
- CC=gcc
- CFLAGS=-c -g -Wall #-c编译 -g加调试 -Wall显示警告
- OBJS=main.o add.o
-
- main: $(OBJS)
- $(CC) $^ -o $@
- %.o: %.c
- $(CC) $(CFLAGS) $< -o $@
-
- .PHONY: clean
- clean:
- $(RM) *.o main
