zoukankan      html  css  js  c++  java
  • 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,欢迎骚扰

  • 相关阅读:
    Spring4
    Mysql索引优化、JMM内存模型
    深入浅出JVM
    ZGC垃圾搜集器
    Hibernate4基础
    红楼梦 各版本及资料
    JavaME环境配置
    5.1 Intent
    4.3 异步任务
    4.2.2 网络编程之Socket
  • 原文地址:https://www.cnblogs.com/953-zjf/p/13417985.html
Copyright © 2011-2022 走看看