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输出到屏幕。

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

linux下C/C++实现进度条(使用make/makefile)

实现一个简单的进度条,动态展示解压或下载进度。需要实现的功能: 打印动态增长的字符串用来显示进度(每次都在同一行覆盖输出字符串,不换行,需要使用\r) 动态增长的百分比反应百分比。 一个动态字符...

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

支持原创:http://blog.csdn.net/haoel/article/details/2886 makefile很重要 什么是makefile?或许很多Winodws的程序员都不知道这个...

Makefile解析和简单的进度条实现

make和makefile简介: make:是一个非常重要的编译命令,本质上它是一个程序。利用make工具,可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使...

Makefile显示编译时间

TIME = $(shell date) all: @echo "$(TIME)"

linux程序编译期加入编译时间和svn版本号

通常我们在程序开发时会加入版本查询命令,如:“-v”,此时一般会显示build版本,以及build日期等,因此如果每次编译时能自动添加这些信息的话,就非常方便了。 下面先说说添加时间的方法: 1.最简...

Makefile使用,Makefile的优化全过程

以一组简单的.c文件为例。从编译命令到Makefile的学习过程。 gcc参数不做过多叙述,如下这几个文件及内容: add.c int add(int a int b) { return ...

待续。makefile关于文件修改时间确定是否需要重新编译的正确书写格式

待续,未解决问题。 #jingz's simple file to test makeFile CPP = g++ OFLAG = -o C++11 = -std=c++11 #定义变异规则,只编...

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

首先建立一个新的文件,touch progress_bar.c 执行该vim progress_bar.c命令,写进度条的程序。写进一个进度条程序:#include #include #include...

LDD3之并发和竞态-completion(完成量)的学习和验证

用代码验证Linux驱动中并发相关的completion中的每个函数。学一次记一辈子。
  • kangear
  • kangear
  • 2014年06月26日 20:35
  • 3907

Linux 的 completion机制

一、定义:linux/include/linux/completion.h13struct completion {14 unsigned int done;15wait_queue_h...
  • dreamxu
  • dreamxu
  • 2010年09月06日 16:29
  • 16498
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:liunx中make、makefile使用及进度条的实现
举报原因:
原因补充:

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