在本章一开始我们提到过 make 的功能是可以简化编译过程里面所下达的命令,同时还具有很多很方便的功能!那么底下咱们就来试看看使用 make 简化下达编译命令的流程吧! 1、为什么要用 make
先来想像一个案例,假设我的运行档里面包含了四个原始码文件,分别是 main.c haha.c sin_value.c cos_value.c 这四个文件,这四个文件的目的是:
[mw_shl_code=applescript,false]# 1. 先进行目标档的编译,最终会有四个 *.o 的档名出现:
[root@www ~]# gcc -c main.c
[root@www ~]# gcc -c haha.c
[root@www ~]# gcc -c sin_value.c
[root@www ~]# gcc -c cos_value.c
# 2. 再进行连结成为运行档,并加入 libm 的数学函式,以产生 main 运行档:
[root@www ~]# gcc -o main main.o haha.o sin_value.o cos_value.o \
> -lm -L/usr/lib -L/lib
# 3. 本程序的运行结果,必须输入姓名、360 度角的角度值来计算:
[root@www ~]# ./main
Please input your name: VBird <==这里先输入名字
Please enter the degree angle (ex> 90): 30 <==输入以 360 度角为主的角度
Hi, Dear VBird, nice to meet you. <==这三行为输出的结果喔!
The Sin is: 0.50
The Cos is: 0.87[/mw_shl_code]
编译的过程需要进行好多动作啊!而且如果要重新编译,则上述的流程得要重新来一遍,光是找出这些命令就够烦人的了! 如果可以的话,能不能一个步骤就给他完成上面所有的动作呢?那就利用 make 这个工具吧! 先试看看在这个目录下创建一个名为 makefile 的文件,内容如下:
[mw_shl_code=applescript,false]# 1. 先编辑 makefile 这个守则档,内容只要作出 main 这个运行档
[root@www ~]# vim 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
# 注意:第二行的 gcc 之前是 <tab> 按键产生的空格喔!
# 2. 尝试使用 makefile 制订的守则进行编译的行为:
[root@www ~]# rm -f main *.o <==先将之前的目标档去除
[root@www ~]# make
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
# 此时 make 会去读取 makefile 的内容,并根据内容直接去给他编译相关的文件罗!
# 3. 在不删除任何文件的情况下,重新运行一次编译的动作:
[root@www ~]# make
make: `main' is up to date.
# 看到了吧!是否很方便呢!只会进行升级 (update) 的动作而已。[/mw_shl_code]
或许你会说:『如果我创建一个 shell script 来将上面的所有动作都集结在一起,不是具有同样的效果吗?』呵呵! 效果当然不一样,以上面的测试为例,我们仅写出 main 需要的目标档,结果 make 会主动的去判断每个目标档相关的原始码文件,并直接予以编译,最后再直接进行连结的动作! 真的是很方便啊!此外,如果我们更动过某些原始码文件,则 make 也可以主动的判断哪一个原始码与相关的目标档文件有升级过, 并仅升级该文件,如此一来,将可大大的节省很多编译的时间呢!要知道,某些程序在进行编译的行为时,会消耗很多的 CPU 资源呢!所以说, make 有这些好处:
简化编译时所需要下达的命令;
若在编译完成之后,修改了某个原始码文件,则 make 仅会针对被修改了的文件进行编译,其他的 object file 不会被更动;
最后可以依照相依性来升级 (update) 运行档。
既然 make 有这么多的优点,那么我们当然就得好好的了解一下 make 这个令人关心的家伙啦!而 make 里面最需要注意的大概就是那个守则文件,也就是 makefile 这个文件的语法啦!所以底下我们就针对 makefile 的语法来加以介绍罗。 2、makefile 的基本语法与变量
make 的语法可是相当的多而复杂的,有兴趣的话可以到 GNU (注1) 去查阅相关的说明,鸟哥这里仅列出一些基本的守则,重点在於让读者们未来在接触原始码时,不会太紧张啊! 好了,基本的 makefile 守则是这样的: