会不会写makefile从侧面能够反映一个人是否具有完成大型工程的能力,虽然我只是渣渣一枚,但是我爱学习呀,j_0013.gif所以。。。。所以今天就浅谈一下有关makemakefile文件的基本操作和用法

一.Makefile是一个文件

  用传统的c/c++语言编写一个程序,都要经历:编辑-编译-连接,这几个步骤。但是在linux平台下这几个步骤是由我们自己来走,因为makefile关系到了整个工程的编译规则,一个工程的源文件不计其数,按功能,类型模块分在若干个目录下,makefile定义了一系列的规则来指定,那些文件需要先编译,那些文件需要后编译。


  1)编译

   编译时编译器需要的是语法正确,函数与变量的声明正确,对于后者,通常只需告诉编译器头文件的所在位置,只要语法正确,编译器就能编译出中间目标文件,一般来说每个文件都应对应于一个中间目标文件(O文件或obj文件)

  2)链接

   链接时主要是链接函数和全局变量,所以可以使用这些中间目标文件来链接我们的应用程序

。链接器并不管函数所在源文件,只管函数的中间目标文件。

   总的来说就是源文件首先会生成中间目标文件,再由中间目标文件生成执行文件,在编译时,编译器只检查语法和函数,变量的声明是否正确,如果函数未被声明编译器会给出一个警告,但可以生成obj文件,链接时,编译器会在所有的obj中寻找函数的实现,若找不到就会报错。

 二. make是一个命令

  Make命令执行时需要一个Makefile文件,用来告诉make命令怎样去编译和链接程序

 在命令窗口输入make命令,make会一层一层的去寻找依赖关系,直到最终编译出第一个目标文件,在寻找过程中如果出现错误make会直接退出,如果这个工程已经被编译过了,当我们修改其中的一个源文件,比如test.c,那么test.o会被重编译

 例如:

1)在当前目录下建立一个makefile文件,cd makefile后在当前makefile 目录下分别建立Makefiletest.c 

 wKiom1dL7PnQeEPzAAANY-XBOJc265.png-wh_50

2vim 进去以后在test.c中编写自己要写的程序,编写完成后保存并退出

 

 wKiom1dL7S-Rmv0EAAAiHE8wNU8862.png-wh_50

3vim Makefile,Makefile中写入依赖关系

 

 wKiom1dL7WPTCrzXAAAqWeY11C4552.png-wh_50

4make寻找依赖关系,并且编译和链接程序

 wKioL1dL7siTTaDEAAAQVZyGfwI105.png-wh_50

 

三.清空目标文件

每个Makefile文件都应该写一个清空目标文件的规则,这不仅便于重编译,也便于保持文件的清洁。一般风格:

.PHONY:clean

Clean:

-rm test.o test.s test.i

.PHONY表示clean是一个伪目标,而在rm前加一个-表示也许某些文件出现问题,但不要管继续做后边的事,但是clean规则不要放在文件开头,不然就会变成make的默认目标,伪目标一般没有依赖文件,但是我们也可以为伪目标指定所依赖文件,伪目标同样也可以作为“默认目标”;

 wKiom1dL7gbTJ-4vAAAe_Svg_7U769.png-wh_50


wKiom1dL7jmDaAZmAAAK9_r0VHI759.png-wh_50 

例子二:自己实现一个小的进度条程序

同样在刚才建立好的makefile文件中建立一个proc.c文件

wKioL1dOp8TTlXG4AABCJXbYi3w040.png-wh_50


wKioL1dOp0HyYBc8AAARfoIZmUg661.png-wh_50


wKioL1dOqBuhthWPAAANlOFXHNU787.png-wh_50