一、基础知识:
命名:makefile,Makefile
1个规则
基本原则:若想生成目标,检查规则中的依赖条件是否存在,如不存在,则寻找是否有规则用来生成该依赖文件
目标:依赖条件
(一个tab缩进)命令
1.目标的时间必须晚于依赖条件的时间,否则,更新目标
2.依赖条件如果不存在,找寻新的规则去产生依赖条件
ALL:指定makefile的终极目标
2个函数
src = $(wildcard ./*.c):匹配当前工作目录下的所有.c文件,将文件名组成列表,赋值给src ,src = add.c sub.c div1.c
obj = $(patsubst %.c,%.o,$(src)):将参数3%(src)中,包含参数1%.c的部分,替换为参数2%.o,obj = add.o sub.o div1.o
清除函数:
clean:(没有依赖)
-rm -rf %(obj) a.out
3个自动变量
$@ : 在规则的命令中,表示规则中的目标
$< : 在规则命令中,表示规则中的第一个条件。如果将该变量应用在模式规则中,它可将依赖条件列表中的依赖依次取出,套用模式规则
$^ : 表示规则中的所有条件
模式规则:
%.o:%.c
gcc -c $< -o $@
静态模式规则:
更加容易地定义多目标的规则
$(obj):%.o:%.c
gcc -c $< -o %@
伪目标:
作用是,如果同级文件下有clean的同名文件,而makefile里的clean命令又没有依赖,如果此时执行make clean,就不会正常执行clean命令,那么就需要加上这个伪目标,写在原先的clean后即可
.PHONY: clean ALL
二、案例:
第一版:
第二版:
更加方便扩展
第三版:
多目录的情况
目录结构:
CC=g++
STD=-std=c++11
FLAG=-Wall -Werror
BIN=emis
src = $(wildcard ./manager/*.cpp)
src += $(wildcard ./service/*.cpp)
src += $(wildcard *.cpp)
OBJ = $(patsubst %.cpp,%.o,$(src))
all: $(OBJ)
$(CC) $(STD) -o $(BIN) $(OBJ) && ./$(BIN)
%.o: %.cpp
$(CC) $(STD) $(FLAG) -c $< -o $@
clean:
-rm -rf $(OBJ) $(BIN) *.h.gch
.PHONY: all clean
另外在makefile中如果想测试取到的是否是自己想要的文件,可以用echo命令,注意,一个makefile里只能有一个all
all:
echo $(src)
echo $(obj)
echo $(CFLAGS)