make makefile
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 #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 固定输出长度 使得是左对齐。上述代码结构
#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输出到屏幕。