MakeFile:       

         一个工程中的源文件不计其数,按类型、功能、模块分别放在若干目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的操作。因为makefile就像一个shell脚本一样,其中也可以执行操作系统的命令。

        makefile一旦写好,只需要一个make命令,整个工程完全自动编译,极大地提高了软件开发的效率。其中,make是一个命令,是一个解释makefile中指令的命令工具,一般来说,大多数IDE都有这个命令,比如:Visual C++nmakeLinuxGUNmake。可见,makefile已经成为了一种在工程方面的编译方法。

         一:MakeFile书写规则

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

         例如我们的工程有8C文件,和3个头文件,我们要写一个MakeFile来告诉make命令如何编译和连接这几个文件。规则是:

           1)如果这个工程没有编译过,那么我们所有C文件都要编译并被链接。

           2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标工程。

           3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

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

          二:make是如何工作的

          默认方式下,我们只输入make命令。那么:

           1 make会在当前目录下找名字叫"Makefile""makefile"的文件。

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

           3)如果第一个目标文件不存在,或者目标文件所依赖的后面的.o文件的文件修改时间要比目标文件新,那么,它会执行后面所定义的命令来生成这个目标文件。

           4)如果目标文件所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(有点像一个堆栈的过程)

           5)当然,你的C文件和H文件是存在的,于是make会生成.o文件,然后再用.o文件声明make的终极任务,就是执行目标文件了。

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

    clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过我们可以显示要make执行。make clean”,以此来清除所有的目标文件,以便重编译。

     三:清空目标文件的规则

     每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,不仅便于重编译,也利于保持文件的清洁。

     一般的风格都是:

     clean:

          rm edit $(objects)

     更为稳健的做法是:

     .PHONY:clean

     clean

          -rm edit $(objects)

     其中,.PHONY意思是表示clean是一个“伪目标”。而在rm命令前面加了一个小减号的意思是,也许某些文件出现问题,但不要管,继续做后面的事。当然,clean的规则不要放在文件的开头,不然,就会变成make的默认目标。不成文的规矩是:“clean从来都是放在文件的最后”。

        伪目标一般没有依赖的文件。但是,我们也可以为伪目标指定所依赖的文件。伪目标同样可以作为“默认目标”,只要将其放在第一个。

     四:进度条

源程序:

     #include<stdio.h>

#include<string.h>

 

void proc()

{

         int count = 0;

         char buf[102];

         memset(buf, '\0', sizeof(buf));

         constchar *lable = '|/-\\';

         while (count <= 100)

         {

                   buf[count] = '#';

                   printf("[%-100s][%d%%][%c]\r",buf,count++,lable[count%4]);

                   fflush(stdout);

                   usleep 10000;

         }

         printf("\n");

}

int main()

{

         proc();

         return 0;

}

步骤: