Ubuntu——makefile的引入(非常通俗易懂)
在嵌入式开发中我们经常用vim编辑代码,用gcc编译器来编译我们的代码,具体实现过程如下:
(1)首先vim hello.c,进入vim编辑器,写好代码
(2)利用gcc编译器对代码进行编译 gcc -o hello hello.c,然后就会生成hello可执行文件,然后执行hello即可
运行结果如下图所示
这是在Linux下使用C语言编写代码的过程,可以看得到,只有一个头文件的时候还不麻烦,但在嵌入式开发的时候,通常都是由几十段代码需要编译,而有时候我们只需要改其中一个或几个文件,难道我要再用gcc一个一个编译吗?答案当然是这辈子都不可能这样编译的,于是就有了Makefile自动化编译工具,下面我们来举个小例说明:
①首先先来一个主函数main.c,这里引入了两个自定义头文件,getnum用来得到键盘输入的数,sumnum用来计算两数之和。
②编写getnum.c和getnum.h
③编写sumnum.c和sumnum.h
⑥一共五个文件,我们已经编写好了
⑦编译gcc main.c getnum.c sumnum.c -o main,生成main可执行文件
⑧运行结果如下图所示
本次示例只有三个文件需要编译,看起来还不算麻烦,但真正的开发中很多文件,而且有时候我们需要修改个别的文件,就没必要所有都编译一遍了吧,于是就要用到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挨个编译生成的文件
③执行Makefile,可以看到我们已经生成了main可执行文件
④运行一下,可以看到没问题,但这还并不能体现Makefile的优势
⑤接下来我们修改getnum.c,将输入提示语改成中文
⑥再次Makefile一下,我们可以看到,因为我们只修改了getnum.c,所以只编译了getnum.c,这就看出Makefile的优势了吧,如果有很多的文件,一个个执行的话,估计需要个吧小时,makefile就是检测文件的修改时间,如果更新了就编译,真的超级方便
好了,今天就先讲到这里,如果有什么问题,可以加QQ:1033278524,欢迎骚扰