make是用来管理一个工程项目的工具 .
Makefile就是这个项目文件 .
1.Makefile 是由若干条规则组成的,每个规则的语法如下所示 :
#规则 targets: prerequisites command
#举例 main.c func1.c hello: main.o func1.o gcc main.o func1.o -o hello main.o: main.c gcc -c main.c func1.o: func1.c gcc -c func1.c
2.makefile的时间戳
对于已经编译过一次的工程,如果没有对源文件进行修改,目标文件是不会重复编译的,这样编译效率比较高.
也就是说,如果目标文件和依赖文件的时间戳是一样的,就不会重新编译,
如果目标文件的时间戳比依赖文件的时间戳旧,就会重新编译.
3.伪目标
对于工程的清理, 需要写一个clean功能,这种类似的功能, 不需要依赖文件,这种命令 称作 伪目标.
#伪目标 # .PHONY: xxx .PHONY: clean clean: rm -rf *.o hello .PHONY: install
install: cp hello /usr/bin .PHONY: uninstall uninstall: rm /usr/bin/hello
4.makefile 的变量
1.用户自定义变量 2.预定义变量 3.自动变量
#用户自定义变量 --宏 OBJ = main.o func1.o ... hello : $(OBJ) gcc $(OBJ) -o hello #预定义变量 AR --> ar CC --> 编译器 ARFLAGS --> 库编译选项 CFLAGS --> C编译器选项 #举例 CFLAGS = -g -c gcc $(CFLAGS) func.c #自动变量 $* --> 不包含扩展名的目标文件名称 #main.o : main.c $* 表示main.o 中的main $< --> 表示第一个依赖文件的名称 $? --> 所有时间戳比目标文件晚的依赖文件 $@ --> 目标文件的完成名称 $^ --> 所有不重复的依赖文件 # hello : main.o func1.o # $(CC) $^ -o $@
5.makefile 条件判断
#条件判断不能用tab 打头 hello: main.o func1.o ifeq ($(CC),gcc) gcc $^ -o $@ else $(CC) $^ -o $@ endif
6.Makefile的嵌套和引用
一个工程是由一层一层Makefile的嵌套组成的 .每个Makefile文件负责管理不同的部分,然后通过嵌套和引用,来管理整个工程的源码 .
#包含 include proc/makefile #嵌套 subsystem: $(MAKE) -C subdir
7.makefile 管理命令
-C dir | 执行指定文件夹下面的makefile |
---|---|
-f file | 读入当前文件夹下的file 为 Makefile |
-i | 忽略所有命令执行的错误 |
-I dir | 指定被包含(include)的Makefile 的路径 |
-C 用于迭代, /-
|-Makefile |-srcA | |-xx.c | |-Makefile |
|-srcB |-xx.c |-Makefile #在根目录下的Makefile $(MAKE) -C srcA $(MAKE) -C srcB
8.用伪目标生成多个文件
.PHONY: all all: tar1 tar2 tar3 tar1: tar1.o $(CC) $^ -o $@ tar2: tar2.o $(CC) $^ -o $@ tar3: tar3.o $(CC) $^ -o $@