在我看来,学会写简单的Makefile,阅读较复杂的makefile,是每个Linux程序员都必须拥有的基本素质。Makefile能够自动识别哪些源文件被更改过,须要从新编译,那些不须要。从而节省大型工程从新编译的时间。规则以下:程序员
学会编写Makefile,不单单有益于你在Linux下编写大型工程。同时也能帮助你理解编译原理。远离IDE,了解编译过程。markdown
废话少说,Makefile其实最主要的语法只有一句:ui
target ... : prerequisites ... command......
target就是目标文件,prerequisites表示全部生成目标文件所需的拥有依赖关系的文件。command就是由依赖文件生成目标文件的编译命令。
因此,对于单个的.c文件,一个最最简单的Makefile以下:spa
object: main.c gcc -o object main.c
固然,对于单个C文件使用Makefile几乎没有意义。
下面来看一个稍复杂一点儿的Makefile文件:code
DIR=./
object: main.o 1.o 2.o
gcc -o object main.o 1.o 2.o
1.o: 1.c my.h
gcc -c 1.c
2.o: 2.c my.h
gcc -c 2.c
main.o: main.c my.h
gcc -c main.c
.PHONY: clean
clean:
rm $(DIR).o object
这是一个稍有实用价值的Makefile,工程由四个源文件构成:my.h 1.c 2.c main.c。
放在最前面的字符串
DIR=./
是变量定义。Makefile中的的变量定义多为字符串,主要目的是为了不重复长字符串输入。
1.o 2.o main.o 分别是三个源文件生成的连接文件。若是你不知道连接文件是什么。。。。找度娘吧。。
首先第一个target通常为最终目标文件,以后的target通常为过程文件。
.PHONY是用来定义伪目标用的。伪目标不是实际要生成的文件,通常为make命令带入的参数。例如上面文件中的clean,其对应的命令为清除全部中间文件以及最后的目标文件。
其实,通常不定义伪目标也是OK的,可是一旦目录下出现了和伪目标重名的文件。这时候Makefile执行伪目标命令就会出错。由于Makefile不知道这是伪目标,而伪目标又没有依赖文件,因此Makefile会跳过伪目标文件对应的命令。get
以上,是对Makefile的一个简单入门介绍,通常,用以阅读大多数的Makefile都已经足够了。深究请百度或者Google。it
版权声明:本文为博主原创文章,未经博主容许不得转载。编译