liunx中make、makefile使用及进度条的实现

原创 2016年06月02日 11:42:56

make  makefile


       

     在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的ObjectFile合成执行文件,这个动作叫作链接(link)

pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的ObjectFile合成执行文件,这个动作叫作链接(link)

      编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置 。

       链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。

      一、make和makefile的介绍

         make:是一个非常重要的编译命令,本质上它是一个程序。利用make工具,可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员来说简直就是一场灾难。而make工具则可自动完成编译工作,并且可以只对程序员在上次编译后修改过的部分进行编译。

        make是一个命令;

           makefile是一个文件;

         make命令执行时,需要一个 Makefile ⽂文件,以告诉make命令需要怎么样的去编译 和链接程序。

         Makefile来告诉make命令如何编译和链接这⼏几个⽂文件。我们的规则是:            1.如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。            2.如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。            3.如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

               在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要以一个Tab键作为开头。记住,make并不管命令是怎么工作的,他只管执行所定义的命令。

 建两个文件  main.c  test.c .

main.c代码如下

 1 #include<stdio.h>
  2 void my_printf();
  3 int main()
  4 {
  5  my_printf();
  6  return 0;
  7 }
test.c代码如下

1 #include<stdio.h>
  2 void my_printf()
  3 {
  4   printf("hello\n");
  5 }
~                  

  makefile文件

   

  在此,伪目标 可以设置,自己想删除的。

完成之后, 输入命令:make   (根据依赖规则生成了中间文件)完成后 (查看) ls


make clean  清除中间文件


二、make如何工作的

       1、当我们只输入make命令(在默认方式下)make会在当前目录下找“makefile”或“Makefile”文件。

           2、如果找到,它会找文件中的第一个目标文件。

           3、如果第一个文件不存在或者第一个文件依赖后面的.o文件的文件修改时间比它新,那么他就会执行后面的文件来生成这个文件。

           4、如果第一个文件依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖文件,如果找到就根据那个依赖规则生成该.o文件

           5、最终用.o文件,执行第一个文件。

  整个make的依赖性,他会根据依赖关系一层一层去找,直到最终编译出第一个目标文件,如果在查找过程出现错误那么make会直接退出,并报错。 而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管⽂文件的依赖性,即,如果在我找了依赖关系之后,冒号后⾯面的文件还是不在,那么就停止了。

三、linux终端进度条实现

原理:

1 设置一个字符数组 来保存输出的字符串

利用\r 回车 使得每次光标回到最左边,覆盖之前的字符串(这里\r 是回车 产生覆盖效果 不是换行 所以不会在下一行有输出,只是在原来的基础上变)

3 没有\n 所以利用fflush刷新(stdout 强制从输出缓冲区输出到屏幕上)

4 用%-101s 固定输出长度 使得是左对齐

对于\r和\n我们要谈谈它们的区别:

对于\r,它是回车,目的是移到下一行首部。(将输出输出到输出缓冲区)

对于\n,它是换行,也就是将光标下移一行。(将输出缓冲区输出到屏幕上)

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<unistd.h>
  4 
  5 void progress()
  6 {
  7         char arr[103];
  8         char *index="|/-\\0";
  9         int i=0;
 10         memset(arr,'\0',sizeof(arr));
 11         arr[0]='[';
 12         arr[101]=']';
 13         arr[102]='\0';
 14         for(i;i<=100;++i)
 15         {
 16                 arr[i+1]='=';
 17                 printf("%-101s[%d%%][%c]\r",arr,i,index[i%4]);
 18                 fflush(stdout);
 19                 usleep(100);
 20 
 21         }
 22         printf("\n");
在上述打印过程中, 用%-101s 固定输出长度 使得是左对齐。
上述代码结构



在此,我们用程序来测以下\n的

{\n会将结果从输出缓冲区强制显示到显示器上 如果没有\n则结果是先输出到输出缓冲区再等输出缓冲区满或者是程序运行结束才输出到输出显示器上}

#include<stdio.h>
int main()
{
    printf("%10s\n","i am student");
    usleep(200);
  return 0;
}


在此情况下,先是打印出i am student,然后再等待200us;

#include<stdio.h>
int main()
{
    printf("%10s","i am student");
    usleep(200);
  return 0;
}


去掉\n后,先是等待200us,再是将i am student输出到屏幕。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Makefile的应用——进度条实现

Makefile:一个工程中的源文件不计数,其按类型,功能、模块分别放在若干目录中,makefile定义一系列的规则来指定,那些文件需要先编译,那些文件后编译,那些文件重新编译,甚至于进行更复杂的功能...
  • Always__
  • Always__
  • 2015年05月13日 23:49
  • 767

make命令详解

make命令参数详解 -b -m 忽略,提供其它版本make兼容性。 -B --always-make 强制重建所有规则的目标,不根据规则的依赖描述决定是否重...
  • dfg0124
  • dfg0124
  • 2015年10月13日 13:41
  • 149

在Linux下用make指令编译进度条程序。

首先建立一个新的文件,touch progress_bar.c 执行该vim progress_bar.c命令,写进度条的程序。写进一个进度条程序:#include #include #include...
  • lxp_mujinhuakai
  • lxp_mujinhuakai
  • 2017年04月06日 16:38
  • 1327

liunx中make、makefile使用及进度条的实现

在linux中要了解make和makefile,首先先要了解以下过程              在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是 pas,首先要把源文件编...
  • l_tudou
  • l_tudou
  • 2016年06月02日 11:42
  • 624

Makefile 经典教程(看完这篇就够了,不信你拉拉进度条)

支持原创:http://blog.csdn.net/haoel/article/details/2886 makefile很重要 什么是makefile?或许很多Winodws的程序员都不知道这个...
  • mhhyoucom
  • mhhyoucom
  • 2017年09月28日 16:58
  • 489

linux中make命令的简单使用以及Makefile文件的书写

Makefile       会不会写makele,从一个侧面说明了一个是否具备完成大型工程的能力。    一个工程中的源件不计数,其按类型、功能、模块分别放在若干个目录中,makele定义了一系列的...
  • Comedly
  • Comedly
  • 2016年08月01日 00:32
  • 5082

makefile中@的作用 make是什么

转载自:http://blog.163.com/laorenyuhai126@126/blog/static/19350779201068028059/ archclean:         ...
  • dfadsg
  • dfadsg
  • 2016年10月27日 10:08
  • 682

Makefile经典教程(掌握这些足够) .

http://www.cnblogs.com/kungfupanda/p/4341184.html makefile很重要       什么是makefile?或许很多Winodws的程序员都不...
  • zxygww
  • zxygww
  • 2015年10月13日 15:00
  • 1104

html js 定制进度条 (一)

最近模仿海康的存储设备录像回放的进度条,由于本人是C语言程序员,对js一知半解还好有网络支持,马马虎虎实现了基本功能。解决问题思路,使用第三方的矢量图库。感谢博主(dmacy):http://blog...
  • zhujinghao09
  • zhujinghao09
  • 2016年09月14日 23:00
  • 1734

Makefile里面的$(MAKE)

make 定义了很多默认变量,${MAKE} 就是预设的 make 这个命令的名称(或者路径)。 make -p 可以查看所有预定义的变量的当前值。 -----------------------...
  • shenwansan_gz
  • shenwansan_gz
  • 2016年01月03日 10:24
  • 1435
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:liunx中make、makefile使用及进度条的实现
举报原因:
原因补充:

(最多只允许输入30个字)