Ubuntu——makefile的引入(非常通俗易懂)

在嵌入式开发中我们经常用vim编辑代码,用gcc编译器来编译我们的代码,具体实现过程如下:

(1)首先vim hello.c,进入vim编辑器,写好代码

Ubuntu——makefile的引入(非常通俗易懂)

(2)利用gcc编译器对代码进行编译 gcc -o hello hello.c,然后就会生成hello可执行文件,然后执行hello即可

Ubuntu——makefile的引入(非常通俗易懂)

运行结果如下图所示

Ubuntu——makefile的引入(非常通俗易懂)

这是在Linux下使用C语言编写代码的过程,可以看得到,只有一个头文件的时候还不麻烦,但在嵌入式开发的时候,通常都是由几十段代码需要编译,而有时候我们只需要改其中一个或几个文件,难道我要再用gcc一个一个编译吗?答案当然是这辈子都不可能这样编译的,于是就有了Makefile自动化编译工具,下面我们来举个小例说明:

①首先先来一个主函数main.c,这里引入了两个自定义头文件,getnum用来得到键盘输入的数,sumnum用来计算两数之和。

Ubuntu——makefile的引入(非常通俗易懂)

②编写getnum.c和getnum.h

Ubuntu——makefile的引入(非常通俗易懂)

 Ubuntu——makefile的引入(非常通俗易懂)

③编写sumnum.c和sumnum.h

Ubuntu——makefile的引入(非常通俗易懂)

Ubuntu——makefile的引入(非常通俗易懂)

⑥一共五个文件,我们已经编写好了

Ubuntu——makefile的引入(非常通俗易懂)

⑦编译gcc main.c getnum.c sumnum.c -o main,生成main可执行文件

Ubuntu——makefile的引入(非常通俗易懂)

⑧运行结果如下图所示

Ubuntu——makefile的引入(非常通俗易懂)

本次示例只有三个文件需要编译,看起来还不算麻烦,但真正的开发中很多文件,而且有时候我们需要修改个别的文件,就没必要所有都编译一遍了吧,于是就要用到Makefile,接下来讲如何使用Makefile

在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。

          target... : prerequisites ...

                   command

                   ...

                   ...
         -------------------------------------------------------------------------------

       target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

       prerequisites就是,要生成那个target所需要的文件或是目标。

       command也就是make需要执行的命令。(任意的Shell命令)
       但有一点要注意,command之前必须要有一个Tab的间距!!!

       这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。

①首先在该目录创建一个文件叫Makefile,并写入代码

main:main.o getnum.o sumnum.o //main文件依赖于 main.o getnum.o sumnum.o
  2     gcc -o main main.o getnum.o sumnum.o //main文件是通过 gcc -o main main.o getnum.o sumnum.o生成的 
  3 main.o:main.c//main.o依赖于main.c 
  4     gcc -c main.c//main.o是通过gcc -c main.o main.c生成的 
  5 getnum.o:getnum.c//getnum.o依赖于getnum.c
  6     gcc -c getnum.c//getnum.o是通过gcc -c getnum.o getnum.c生成的 
  7 sumnum.o:sumnum.c//sumnum.o依赖于sumnum.c 
  8     gcc -c sumnum.c//sumnum.o是通过gcc -c sumnum.o sumnum.c生成的 
  9 clean://执行清理命令 
 10     rm *.o//删除所有.o文件 
 11     rm main//删除main可执行文件

个人感觉,makefile就想一个套娃,写清楚目标文件依赖于什么文件,接下来一行就写是什么命令生成的

②删除我们之前用gcc挨个编译生成的文件

Ubuntu——makefile的引入(非常通俗易懂)

③执行Makefile,可以看到我们已经生成了main可执行文件

Ubuntu——makefile的引入(非常通俗易懂)

④运行一下,可以看到没问题,但这还并不能体现Makefile的优势

Ubuntu——makefile的引入(非常通俗易懂)

⑤接下来我们修改getnum.c,将输入提示语改成中文

Ubuntu——makefile的引入(非常通俗易懂)

⑥再次Makefile一下,我们可以看到,因为我们只修改了getnum.c,所以只编译了getnum.c,这就看出Makefile的优势了吧,如果有很多的文件,一个个执行的话,估计需要个吧小时,makefile就是检测文件的修改时间,如果更新了就编译,真的超级方便

Ubuntu——makefile的引入(非常通俗易懂)

好了,今天就先讲到这里,如果有什么问题,可以加QQ:1033278524,欢迎骚扰

Ubuntu——makefile的引入(非常通俗易懂)

上一篇:Ubuntu 20.04 Install SSH, Change SSH Port, Enable root


下一篇:2020-07-31 Linux 8开始学习(第六课)