在编写c/c++测试程序时,我们习惯每次修改一处代码,然后就马上编译运行来查看运行的结果。这种编译方式对于小程序来说是没有多大问题的,可对于大型程序来说,由于包含了大量的源文件,如果每次改动一个地方都需要编译所有的源文件,这个简单的直接编译所有源文件方式对程序员来说简直是噩耗。
<强>我们看一个例子:强>
//c # include“a.h”//2.摄氏度 # include“a.h” # include“b.h”//3.摄氏度 # include“b.h” # include“刘昀”
如果程序员只修改了头文件刘昀,则源文件c和2.摄氏度都无需编译,因为它们不依赖这个头文件。而对3.摄氏度来说,由于它包含了刘昀,所以在头文件刘昀改动后,就必须得新编译。
而如果改动了b.h可是忘记编译了2.摄氏度,那么最终的程序就可能无法正常工作。
让工具就是为了解决上述问题而出现的,它会在必要时重新编译所有受改动影响的源文件。
让命令本身支持许多选项,最常用的是- f选项。如果我们直接运行
使
那么让命令会首先在当前目录查找名为makefile的文件,如果找不到,就会查找名为makefile的文件。
为了指示让命令将哪个文件作为makefile文件,可以使用- f选项:
让- f Makefile1
让命令功能虽然十分强大,但是光凭其自身无法了解如何构建应用程序的。这时,makefile就出来了,它告诉让应用程序如何构建的使命令和makefile文件的结合提供了一个在管理项目的十分强大的工具,它们不仅用于控制源文件的编译,而且还提供了将应用程序安装到目标目录等其他功能。
<强> 3.1依赖关系强>
依赖关系定义了应用程序里面每个文件与其他源文件之间的关系,例如在上面的例子中,我们可以定义最终应用程序依赖于目标文件main.o, 2.和3. o。同样,main.o依赖于c和a.h, 2. o依赖于2.摄氏度,a.h和b.h, 3. o依赖于3.摄氏度,b.h和刘昀
在makefile文件中,依赖关系的写法是:先写目标的名称,然后紧跟一个冒号,接着是空格或者制表符选项卡,最后是用空格或者制表符标签隔开的文件列表。上面的例子的依赖关系如下:
myapp:主要。o 2。3. o 主要。o:主要。c a.h 2.o: 2。c。h b.h 3.o: 3。c b。h刘昀
这组依赖关系形成一个层次结构,展示了源文件之间的关系,例如,如果源文件b.h发生改变,就需要重新编译2.和3. o,接下来还需要重新编译myapp .
<强> 3.2规则强>
makefiel文件中的规则定义了目标的创建方式。在上面的例子中,我们使用gcc - c 2.摄氏度创建2. o。这个gcc命令即是目标2. o的创建方式,也即是规则。
在makefile文件中,规则都必须以选项卡开头。
在源文件所在的目录下创建Makefile1文件,其内容如下。
myapp:主要。o 2。3. o gcc - o myapp主要。o 2。3. o 主要。o:主要。c a.h gcc - c c 2.o: 2。c。h b.h gcc - c 2.摄氏度 3.o: 3。c b。h刘昀 gcc 3. c - c
三个头文件a.h, b.h,刘昀内容都为空,源文件的内容如下:
/*主。c */# include & lt; stdlib.h> # include“a.h” 外面的空白function_two (); 外面的空白function_three (); int main () { function_two (); function_three (); 退出(EXIT_SUCCESS); }
/* 2。c */# include & lt; stdio.h> # include“a.h” # include“b.h” 空白function_two () { printf("函数二\ n "); }
/* 3。c */# include & lt; stdio.h> # include“b.h” # include“刘昀” 空白function_three () { printf(“函数三\ n”); }
执行让命令:
让美元- f Makefile1 gcc - c c gcc - c 2.摄氏度 gcc - c 3.摄氏度 gcc - o myapp主要。o 2。3. o
运行应用程序:
美元。/myapp 两个函数 函数三
从输出可以说明应用程序已被正确构建。