对于makefile的初步的理解
今天刚刚学习了make这个工程管理器,下面是主要我今天对于这个工程管理器的学习到的知识以及一些例子。
gcc提供了半自动化的工程管理器Make,所谓的半自动化是指在使用工程管理器前都需要人工的编写程序的编译规则,所有的编译规则都保存在Makefile文件中,全自动化的工程管理器在编译程序前会自动的生成Makefile文件。
Make工程管理器的优越性有以下两个方面:
1.使用方便,通过命令Make就可以启动Make工程管理器对程序进行编译,所以 不再需要每次都输入gcc的命令行。Make启动后会根据Makefile文件中编译的规则命令自动的对源文件进行编译和链接,最终生成可以执行的文件。
2.编译的效率高,主要是因为一旦修改源文件后,Make的时候会检查每个源文件的时间戳,只有时间戳改变的源文件才会编译与链接,这样节省了很多的编译的时间。因为检查的是时间戳,所以操作系统的时间一定要正确性。
Makefile 主要有三项内容组成:
1.需要生成的目标文件(target)
2.生成目标文件需要依赖的文件(dependency file)
3.生成目标文件的编译规则命令(command)
格式:
Target : dependency file
Commad (前面要加tab键,最好能看见变色,如果在Make的时候会有分隔号遗漏的错误,就是因为tab的原因)
举个例子:
//makefile:
test : a.o b.o
cc -o test a.o b.o
a.o:a.c
cc -c a.c
b.o:b.c
cc -c b.c
这样的makefile 文件只要make一下就能生成最后的执行文件test
主要是maked的时候查找Makefile文件里面第一个目标文件,本例子里面是test,test就是工程管理器的最终的目标。
目标文件test的依赖的文件当做目标文件进行依赖规则的检查,这是一个递归的检查的过程,在这个例子里面依次把a.o和b.o作为目标文件来检查依赖的文件。
注:过程看上去就是从下面往上面执行,但是是因为目标文件的依赖文件是下面的目标文件,所以就先让线面的目标文件生成后,然后第一个目标文件所依赖的文件能够使用。
还有,为什么不直接依赖的是.c的文件,而是依赖的是.o的文件,这是在修改源文件后再次编译的时候,原来的.o文件就不用编译(如果时间戳没有发生变化的话)。
上面的例子所有的.c在一个文件夹里面。
而将子功能放在相应的子文件夹里面,里面主要有三种Makfile的文件:
1.Scripts里面的一个Makefile定义许多的变量。
2.总的Makefile,进入子功能目录,执行make,将所有的.o的文件以及连接生成一个可以执行的文件。
3.将src里面的.c的里面的文件编成.o的文件。
所有建立的文件夹
对于其余的功能的子目录里面的Makefile文件都一样
拿add举例:
只要在test目录下执行make就可以了。
注解:里面一个.PHONY,后面定义的是一些为目标的名字,而对于伪目标,它只是执行命令规则。
如果你不想从第一个目标问价开始执行,例如你只是想执行clean的话,那么make clean,就可以啦。对于你的makefile的名字不是makefile,而是makefile2,那么只需要
make -f makefile2
对于里面的include... 相当于头文件。
一个进入子目录make的命令规则:$(MAKE) -C add(文件名)
上面的一种模板用的make里面的函数,所以使这个makefile变的更加的简单。
使用函数,也能换成普通的规则写能够完成。