会不会写makefile从侧面能够反映一个人是否具有完成大型工程的能力,虽然我只是渣渣一枚,但是我爱学习呀,所以。。。。所以今天就浅谈一下有关make和makefile文件的基本操作和用法
一.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 目录下分别建立Makefile和test.c
(2)vim 进去以后在test.c中编写自己要写的程序,编写完成后保存并退出
(3)vim Makefile,在Makefile中写入依赖关系
(4)make寻找依赖关系,并且编译和链接程序
三.清空目标文件
每个Makefile文件都应该写一个清空目标文件的规则,这不仅便于重编译,也便于保持文件的清洁。一般风格:
.PHONY:clean
Clean:
-rm test.o test.s test.i
.PHONY表示clean是一个伪目标,而在rm前加一个-表示也许某些文件出现问题,但不要管继续做后边的事,但是clean规则不要放在文件开头,不然就会变成make的默认目标,伪目标一般没有依赖文件,但是我们也可以为伪目标指定所依赖文件,伪目标同样也可以作为“默认目标”;
原文地址:http://10808695.blog.51cto.com/10798695/1784479