编译的过程需要进行好多动作啊!而且如果要重新编译,则上述的流程得要重新来一遍,光是找出这些指令就够烦人的了! 如果可以的话,能不能一个步骤就给他完成上面所有的动作呢?那就利用 make 这个工具吧! 先试看看在这个目录下创建一个名为 makefile 的文件,内容如下:
或许你会说:“如果我创建一个 shell script 来将上面的所有动作都集结在一起,不是具有同样的效果吗?”呵呵! 效果当然不一样,以上面的测试为例,我们仅写出 main 需要的目标文件,结果 make 会主动的去判断每个目标文件相关的源代码文件,并直接予以编译,最后再直接进行链接的动作! 真的是很方便啊!此外,如果我们更动过某些源代码文件,则 make 也可以主动的判断哪一个源代码与相关的目标文件文件有更新过, 并仅更新该文件,如此一来,将可大大的节省很多编译的时间呢!要知道,某些程序在进行编译的行为时,会消耗很多的 CPU 资源呢!所以说, make 有这些好处:
简化编译时所需要下达的指令;
若在编译完成之后,修改了某个源代码文件,则 make 仅会针对被修改了的文件进行编译,其他的 object file 不会被更动;
最后可以依照相依性来更新 (update) 可执行文件。
既然 make 有这么多的优点,那么我们当然就得好好的了解一下 make 这个令人关心的家伙啦!而 make 里面最需要注意的大概就是那个规则文件,也就是 makefile 这个文件的语法啦!所以下面我们就针对 makefile 的语法来加以介绍啰。
21.3.2 makefile 的基本语法与变量
make 的语法可是相当的多而复杂的,有兴趣的话可以到 GNU 去查阅相关的说明,鸟哥这里仅列出一些基本的规则,重点在于让读者们未来在接触源代码时,不会太紧张啊! 好了,基本的 makefile 规则是这样的:
如此一来,我们的 makefile 里面就具有至少两个标的,分别是 main 与 clean ,如果我们想要创建 main 的话,输入“make main”,如果想要清除有的没的,输入“make clean”即可啊!而如果想要先清除目标文件再编译 main 这个程序的话,就可以这样输入:“make clean main”,如下所示:
# 1\. 先编辑 makefile 来创建新的规则,此规则的标的名称为 clean :
[root@study ~]# vi makefile
main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
rm -f main main.o haha.o sin_value.o cos_value.o
# 2\. 以新的标的 (clean) 测试看看执行 make 的结果:
[root@study ~]# make clean <==就是这里!通过 make 以 clean 为标的
rm -rf main main.o haha.o sin_value.o cos_value.o
[root@study ~]# make clean main
rm -rf main main.o haha.o sin_value.o cos_value.o
cc -c -o main.o main.c
cc -c -o haha.o haha.c
cc -c -o sin_value.o sin_value.c
cc -c -o cos_value.o cos_value.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
[root@study ~]# vi makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
[root@study ~]# CFLAGS="-Wall" make clean main
# 这个动作在上 make 进行编译时,会去取用 CFLAGS 的变量内容!
[root@study ~]# vi makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}