i.MX6ULL终结者初识Makefile

文章目录

    • 1. 什么是Makefile
    • 2. 第一个Makefile

1. 什么是Makefile

在上章节我们了解了在Ubuntu系统下通过gcc编译器来编译C程序,在我们演示的例程中只有一个C文件,我们直接在终端输入gcc的编译命令,就完成了C程序的编译。我们在实际开发过程中,如果我们的工程有几十个,或者几百几千个C文件,我们通过在终端输入gcc命令来编译,这显然是不现实的。为了解决这个问题我们可以使用“make”命令,它会解析Makefile文件中的指令(应该说是规则)来编译整个工程。在Makefile文件中描述了整个工程的所有文件的编译顺序,编译规则。

作为一个专业的程序员,一定要掌握Makefile的,我们可以通过Makefile能了解到整个工程的处理过程的。

由于Makefile涉及到很多的知识点,以至于可以单独写本书来讲述,所以本章我们只是讲解下Makefile的基础入门,如果详细的研究Makefile,可以给大家推荐《跟我一起写 Makefile》这个电子文档,该文档已经放在了:i.MX6UL终结者光盘资料\10_其它参考资料里面了。

2. 第一个Makefile

在本节我们建立这样一个工程,计算两个整型数的和,并将结果在终端显示出来。在这个工程中一共有main.c、calc.c两个C文件和calc.h这个头文件。其中main.c是主文件,calc.c负责接收main.c传过来的数据,然后进行相加。main.c文件的内容如下:

#include 
#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 

int calc(int a, int b)
{
	return (a+b);
}

文件calc.h内容如下:

#ifndef _CALC_H
#define	_CALC_H

int calc(int a, int b);
#endif

上面就是我们这个工程的所有源文件,我们在终端使用gcc编译这个工程,在终端输入“gcc main.c calc.c -o main”,该命令的意思是用gcc对main.c、calc.c进行编译,然后输出可执行文件main,运行结果如图 2.1所示:

i.MX6ULL终结者初识Makefile_第1张图片

图 2.1

通过上图可以看到生成了可执行文件main,我们在终端运行main执行文件,运行结果如图 2.2所示:

在这里插入图片描述

图 2.2

我们可以看到上图的运行结果和我们设计的结果是一致的。由于我们的这个工程是有三个文件,如果工程有几百个,几千个的文件,或者如果有一个文件被修改,使用上面的命令将会编译所有的文件,如果我们的工程有上万个文件,编译完一次工程所需要的时间就很可怕。最优的方法就是编译过一次以后,如果后面再编译,只编译修改的文件,这样就会节约很多时间,因此我们修改下编译方法,命令如下:

gcc -c main.c
gcc -c calc.c
gcc main.o calc.o -o main

我们在终端输入上面的命令,结果如图 2.3所示:

i.MX6ULL终结者初识Makefile_第2张图片

图 2.3

上图的第一条和第二条命令里面使用了参数“-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的语法要求,编写完成的脚本如图 2.4所示:

i.MX6ULL终结者初识Makefile_第3张图片

图 2.4

编写好Makefile,保存并退出,然后我们在终端输入“make”命令来编译我们的工程,make命令会在当前目录下查找“Makefile”文件,如果存在的话就按照Makefile里面的规则进行编译,如图 2.5所示:

i.MX6ULL终结者初识Makefile_第4张图片

图 2.5

通过上图可以看到编译产生了main.o、calc.o和main执行文件,说明编译成功了。接下来我们修改下main.c这个文件,如图 2.6所示:

i.MX6ULL终结者初识Makefile_第5张图片

图 2.6

然后保存并退出,然后在终端输入“make”再次编译下工程,如图 2.7所示:

i.MX6ULL终结者初识Makefile_第6张图片

图 2.7

通过上图我们可以看到只重新编译了修改的main.c,并最终重新链接生成可执行文件main,我们在终端运行可执行文件main,如图 2.8所示:

在这里插入图片描述

图 2.8

从上图的运行结果可以看到最后的结果等于10了,和我们程序的设计结果是一样的。

i.MX6ULL终结者初识Makefile_第7张图片

你可能感兴趣的:(i.MX6ULL终结者,#,第一部分,总领及学习指引)