目的:
明白自动推导功能能干什么事。
场景:
当前目录下有两个文件 main.c和makefile;
其中main.c内容如下:
#include
#include
int main(int argc, char** argv)
{
printf("functionName: %s; fileName: %s; lineNumber: %d\n" , __func__, __FILE__, __LINE__);
return 0;
}
CC=gcc
CFLAGS=-g
RM=rm
main:main.o
$(CC) $(CFLAGS) -o $@ $^
main.o:main.c
$(CC) $(CFLAGS) -c $^
.PHONY=clean
clean:
$(RM) main *.o
执行命令make
可以顺利进行编译,生成目标文件main.o 和可执行文件main。
make的自动推导功能: 只要make看到一个规则中的目标[.o]文件,它就会自动的把[.c]文件加在依赖中,在这个例子中,make找到一个main.o,那么main.c,就会被推导成main.o的依赖文件,并且 cc -c main.c 也会被推导出来。
简化后的makefile:
CC=gcc
CFLAGS=-g
RM=rm
main:main.o
$(CC) $(CFLAGS) -o $@ $^
main.o:
.PHONY=clean
clean:
$(RM) main *.o
执行make命令:
可以看出, 本来要写两行的东西(方框2里面),现在只要写一个main.o就可以了。 相当于make帮助了开发人员多干了一些活。
和目标clean不一样的是,目标clean所在的规则是有命令的,相同的是,也可以像执行make clean 一样直接执行make main.o就可以重建目标main.o.