下边的代码改了好几遍的了,基础的部分就不说了,重点记几点:$@是目标文件,$^是依赖的所有目标,$<是依赖的第一个。
这里重点测了一下依赖第一个的命令$<
如果你要把三个源文件.c编译成三个目标文件.o,再编译成最终的可运行文件。
这个$<是不能乱用的,必须配合“.c.o:”规则,这个规则是指所有.c依赖对应名称的.o,只有它才能配合$<完成完整编译(假设打包了,就算一个),不然的话真的是只编译规则依赖的第一个文件。
TARGET = main
SRC = main.c func1.c func2.c
#SRC = func1.c func2.c main.c
OBJ = $(patsubst %.c,%.o,$(SRC))
HEADER = $(patsubst %.c,%.h,$(SRC))
CC = gcc
#$(TARGET) : $(OBJ)
# $(CC) $(OBJ) -o $(TARGET)
#$(OBJ) : $(SRC)
# $(CC) -c func1.h func2.h $*.cpp -o $@
#all : $(TARGET)
$(TARGET) : $(OBJ)
$(CC) -o $@ $^
#$(OBJ) : $(SRC) $(HEADER)
.c.o:
# $(CC) -c main.c
# $(CC) -c $<
#func1.o func2.o main.o: func1.c func2.c main.c
gcc -c $<
CLEAN:
rm *.o
rm $(TARGET)
SRC = main.c func1.c func2.c
OBJ = $(patsubst %.c,%.o,$(SRC))
等价与
OBJ = main.o func1.o func2.o
HEADER同理,换成.h
patsubst是是替换用的,这是makefile里的函数,用法和C里的函数不太一样,$相当于返回值,()内部是函数名和参数名。
make创建的命令是大小写敏感并且完全自定义的,有些之所以用起来一样,是因为约定成俗,比如
#make clean
而本例真想删除目标文件和.o文件的话,要用
#make CLEAN
才行。
PS:勤删除.o文件,不然会干扰对Makefile的测试。