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

来源:互联网 发布:天刀真武捏脸数据 编辑:程序博客网 时间:2024/04/29 18:33

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

0 0
原创粉丝点击