CC = g++
OBJS = main.o base.o derive.o
EXEC = test
$(EXEC): $(OBJS)
$(CC) -o $@ $^
main.o: main.cpp base.h derive.h
$(CC) -c $<
base.o: base.cpp base.h
$(CC) -c $<
derive.o: derive.cpp derive.h base.h
$(CC) -c $<
clean:
rm -rf $(EXEC) *.o
几个概念: 变量, 目标, 依赖.
变量: CC = g++, 这个CC就是一个在makefile里定义的变量, 在定义后可以使用, 使用时是$(CC).
目标和依赖: main.o: main.cpp base.h derive.h, 这个":"(冒号)分开的两边中, 左边就是目标, 右边就是该目标的依赖, 而下一行的命令就是对应于这一对目标/依赖关系的. 当需要实现这个目标时, 如果依赖中有更新, 就需要执行下面的命令.
比如, 当我们执行:
make clean
就会执行对应目标"clean"下的命令, 因为clean是没有依赖的, 所以这个命令总被执行.
3. 隐含变量:
在这个makefile文件中, 可以看到诸如$^ $< $@这样的东西, 这被我称为makefile的隐含变量.
$^: 指的是当前依赖中的所有对象.
$<: 指的是当前依赖中的第一个对象.
$@: 指的是当前目标.