本文是介绍3.3 初识 Makefile+3.4Makefile语法
3.3 初识 Makefile 3.3.1 什么是 Makefile 在 3.2 章节我们了解了在 Ubuntu 系统下通过 gcc 编译器来编译 C 程序,在我们演示的历程中只有一个C 文件,我们直接在终端输入 gcc 的编译命令,就完成了 C 程序的编译。我们在实际开发过程中,如果我们的工程有几十个,或者几百几千个 C 文件,我们通过在终端输入 gcc 命令来编译,这显然是不现实的。为了解决这个问题我们可以使用“make”命令,它会解析 Makefile 文件中的指令(应该说是规则)来编译整个工程。在 Makefile 文件中描述了整个工程的所有文件的编译顺序,编译规则。 作为一个专业的程序员,一定要掌握 Makefile 的,我们可以通过 Makefile 能了解到整个工程的处理过程的。 由于Makefile涉及到很多的知识点,以至于可以单独写本书来讲述,所以本章我们只是讲解下Makefile的基础入门,如果详细的研究 Makefile,可以给大家推荐《跟我一起写 Makefile》这个电子文档,该文档已经放在了:i.MX6UL 终结者光盘资料\09_其它参考资料里面了。 3.3.2 第一个 Makefile在本节我们建立这样一个工程,计算两个整形数的和,并将结果在终端显示出来。在这个工程中一共有main.c、calc.c 两个 C 文件和 calc.h 这个头文件。其中 main.c 是主文件,calc.c 负责接收 main.c 传过来的数据,然后进行相加。main.c 文件的内用如下: #include <stdio.h> include "calc.h" int main(int argc, char *argv[]) { int a = 3, b = 6, sum; sum = calc(a, b); printf("%d + %d = %d\n", a, b, sum); return 0; } calc.c 文件内容如下: #include <calc.h> int calc(int a, ing b) { return (a+b); } 文件 calc.h 内容如下: #ifndef _CALC_H #define _CALC_H int calc(int a, int b); #endif 上面就是我们这个工程的所有源文件,我们在终端使用 gcc 编译这个工程,在终端输入“gcc main.ccalc.c -o main”,该命令的意思是用 gcc 对 main.c、calc.c 进行编译,然后输出可执行文件 main,运行结果如下图所示: 通过上图可以看到生成了可执行文件 main,我们在终端运行 main 执行文件,运行结果如下图所示: 我们可以看到上图的运行结果和我们设计的结果是一致的。由于我们的这个工程是有三个文件,如果工程有几百个,几千个的文件,或者如果有一个文件被修改,使用上面的命令将会编译所有的文件,如果我们的工程有上万个文件,编译完一次工程所需要的时间就很可怕。最优的方法就是编译过一次以后,如果后面在编译,只编译修改的文件,这样就会节约很多时间,因此我们修改下编译方法,命令如下: gcc -c main.c gcc -c calc.c gcc main.o calc.o -o main 我们在终端输入上面的命令,结果如下图所示: 上图的第一条和第二条命令里面使用了参数“-c”是把 main.c 和 calc.c 编译成对应的.o 文件,最后一条命令是把编译生成的.o 文件链接成可执行文件 main。假如我们修改了 main.c 这个文件。只需将 main.c这个一个文件重新编译下,然后在把所有的.o 文件重新链接成可执行文件,对应的命令如下: gcc -c main.c gcc main.o calc.o -o main 可是这样还有一个问题,如果需要修改的文件有很多,这样工作量也会不小,所以我们需要一个工具: 1.如果工程没有编译过,就会把工程中的.c 文件全部编译并连接成可执行文件 2.如果工程中有某些文件修改了,只编译修改的文件并连接成可执行文件 3.如果工程中的头文件修改了,那么就要编译所有引用这个头文件的.c 文件,并且连 接成可执行文件 我们开头说的 Makefile 就是完成这个功能的,下面我们在工程中建立一个 Makefile 文件来实现这样的功能(注意:文件名字必须为 Makefile,大小写是区分的)。我们使用 vim 创建 Makefile 文件(Makefile和我们的 main.c、calc.c 在同一级目录下),然后输入下面的脚本: main:main.o calc.o gcc -o main main.o calc.o main.o:main.c gcc -c main.c calc.o:calc.c gcc -c calc.c clean: rm -rf *.o rm -rf main 上面脚本缩进的行需要使用“Tab”键缩进,不要使用空格,这是 Makefile 的语法要求,编写完成的脚本如下图所示: 编写好 Makefile,保存并退出,然后我们在终端输入“make”命令来编译我们的工程,make 命令会在当前目录下查找“Makefile”文件,如果存在的话就按照 Makefile 里面的规则进行编译,如下图所示: 通过上图可以看到编译产生了 main.o、calc.o 和 main 执行文件,说明编译成功了。接下来我们修改下 main.c 这个文件,如下图所示: 然后保存并退出,然后在终端输入“make”再次编译下工程,如下图所示: 通过上图我们可以看到只重新编译了修改的 main.c,并最终重新链接生成可执行文件 main,我们在终端运行可执行文件 main,如下图所示:
|