版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012351051/article/details/88626891
Makefile中本身是没有 all 指令的,这里只不过是一种约定,认为目标 all 可以同时做很多事儿,也就能能同时生成多个目标,举例1-代码如下:
/*-------------- main1.c -----------------*/
#include <stdio.h>
int main( void )
{
printf("main1 task!\n");
}
/*-------------- main2.c -----------------*/
#include <stdio.h>
int main( void )
{
printf("main2 task!\n");
}
对应的Makefile如下:
all : main1 main2
main1 : main1.o
gcc main1.o -o main1
main2 : main2.o
gcc main2.o -o main2
%.o : %.c
gcc -c $< -o $@
我们知道,一个Makefile中只有一个最终目标,就是第一个目标,上面的代码中,显然就是 all,那么all的依赖元素有2个,分别为main1和main2,而make具有自动推导,make在生成all的时候,自然要自动推导出main1和main2,这样我们就能通过一个Makefile生成了2个目标,分别是main1和main2,而这两个都是可执行程序,很巧妙的用法。
上面的代码还只是为了说明问题,我们再进一步举例,来实现,既能生成2了个目标,同时删除中间文件*o,只需要修改Makefile如下:
all : main1 main2 clean
main1 : main1.o
gcc main1.o -o main1
main2 : main2.o
gcc main2.o -o main2
%.o : %.c
gcc -c $< -o $@
clean :
rm -f *.o
那么执行make后,能够生成2个执行文件main1和main2,同时还能够删除掉编译输出文件.o.
小结:由于make的自动推导功能,一个目标的依赖既可以是中间文件,也可以是其他目标,这以功能,使得我们可以同时生成多个目标,并且可以通过一些特殊目标,比如clean,可以实现自动化编译,还可以实现自动“打扫卫生”的功能。