我们都知道程序在执行之前会有两个很重要的过程:编译和链接。当然我们在Windows平台的编译器中(像vs),它会自动帮我们生成最后的执行程序,如(xxx.exe);但是Linux下我们使用vim时,gcc和g++是可以一次性将一个源代码生成可执行程序,可是一个项目可不止一个源文件,一个项目的运作是要将各个源代码编译成目标文件后,再将它们链接起来后执行的。
试想一下如果一个工程有上百个源文件,那你将所有源文件都编译链接完后,程序也能跑起来,然后你的boss不满意,让你修改几处地方,然后你改完之后又得在写一遍,好不容易写完,他还是不乐意,然后你又得写一遍......其实这里你大部分时间都被浪费在无用功上,那些编译和链接的命令其实只要写一遍就好,每回改完只要叫它们再运行一次就好。
而make和Makefile就是可以解决这样的问题,你将你的编译和链接命令写入Makefile中,每回运行的时候执行一下make命令,它就会把你的执行程序给生成出来。如果你要修改的话,那你只要修改完之后在执行下make命令即可,是不是很方便?(嘿嘿),其实学会了make和Makefile的使用对你对编程的学习效率和以后工作效率都有很大帮助,下面来看看它们使用方法吧:
我已进度条这个小程序为例,关于进度条大家肯定不陌生,只要是上过网的都见过,它的代码原理也很简单,我让它每过一个规定的时间,就刷新一个'#',后面跟上百分比。刷新的时候只在当前行,所以每次要回车,代码如下:
#include<stdio.h>
#include<string.h>
void proc()
{
char str[102];
char s[]={'|','/','-','\\'};
memset(str,'\0',sizeof(str));
int count=100;
int i=0;
for(;i<=count;++i)
{
str[i]='#';
printf("[%-100s][%d%%][%c]\r",str,i,s[i%4]);
usleep(100000);
fflush(stdout);
}
printf("\n");
return;
}
int main()
{
proc();
return 0;
}
结果由于是动态的,这里不好发图,就不展示了,我们还是看后面的Makefile怎么编写吧,这才是重点。
上面是一个已经写好的源文件叫proc.c,它生成应用程序proc要经过下面的过程:
Makefile的编写要把握住两个点:依赖关系和依赖方法
就那上面的程序来说,我们最后要生成proc的程序,proc要通过proc.o来生成,可是现在没有proc.o,所以就在往后看proc,o是由proc.s生成,接着往下推就会发现我们推到peoc.c,因为proc.c是存在的,因此它可以生成proc.i,然后再往上推,最后就可以生成proc这个程序了。
上面这个就是整个程序的依赖关系,而依赖方法就是我们所使用的命令啦,下面是proc.c的Makefile的编写:
先是依赖关系,然后是依赖方法,写依赖关系时目标文件在前,依赖文件在后
还有一点需要提醒的是在写依赖方法时,前面要加Tab键
在Makefilr中有一个不成文的规定:
每一个Makefile中都要有清空目标文件的能力
毕竟自己写的东西要自己负责嘛,如果么有的话,你的程序改完后还是要将之前的程序删掉,这样不好管理,有时还会坑到别人,所以要有这个“修养”!
清理目标文件的方法就是先用.PHONY创建一个“伪目标”,我上面的clean就是一个伪目标,再给伪目标定义方法,也就是删除目标文件的命令。
还有规定claer必须放在文件最后!
接下来就是执行我们的make命令来看看效果了,这里先说下make是怎么工作的哈:
当make执行起来后,会找当前目录下的Makefile文件,然后找第一个目标文件,并把它作为最终文件,并通过你给的依赖方法生成最终文件,然后停止。
由于我们的clean和最终文件没有半毛钱关系,所以想要执行clean,就要用make命令进行显示调用才起作用。
我们可以通过上面的例子来看看make的效果:
首先先执行make
这时候出现proc,说明文件成功被编译链接。
然后我们再用make显示执行下clean:
proc程序也就消失了
这就是make和Makefile的基本用法,还是很方便的,希望大家看完之后对你们有所帮助,在说拜拜之前,补充下如果想在终端显示依赖方法的话,就把前面的@去掉哦!
好了,再了个见呐!
转载于:https://blog.51cto.com/cuiyuxuan/1784995