接触过linux的人对一个文件,肯定不会陌生,那就是Makefile。在使用make编译程序时,make会根据每个文件的时间戳,来决定那些文件需要重新编译,哪些文件已经是最新的了不需要编译,然后再根据同一目录下的Makefile所定义的编译规则编译文件。下面就来跟各位探讨一下,自己学习Makefile的一些心得体会:
1.Makefile规则
一个简单的Makefile文件包含一系列的“规则”,基本格式如下:
目标(tatget)...:依赖(prerequiries)
<tab>命令(command)
目标(target)一般是要生成的文件名称,可以是可执行文件或OBJ文件(*.o)也可以是一个可执行的动作名称,例如:“clean”,“cp”等。
依赖(prerequiries)一般是生成目标的材料(如源文件),通常情况下,一个目标会有几个依赖文件,在这种情况下,将所有的依赖文件写在一起,中间用“,“隔开。
命令是依赖(prerequiries)生成目标(target)所执行的动作,一个规则可以含有多个命令,每个命令占一行,(注意:每个命令前必须是一个Tab)
2.Makefile的赋值方法
例如:immediate = deferred
immediate ?= deferred
immediate := deferred
immediate += deferred or immediatate
在GNU make中对变量有两种定义:延时变量、立即变量。两者的区别在于,定义的方式和扩展的方式不同。前者是在这个变量使用时才扩展,亦即当真正使用时这个变量的值才确定;后者在定义时它的值就已经确定了。使用"="、"?="定义或使用define命令定义的变量都是延时变量,使用“:=”定义的变量是立即变量,需要注意的是,“?=”仅仅是在变量还没有定义的情况下有效,即“?=”用来定义第一次出现的延时变量。
对于附加操作符“+=”,右边变量如果是在前面使用(:=)定义的立即变量,则它是立即变量,否则均为延时变量。