1.它们是什么?
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率
2.如何使用它们?
1.在当前目录下创建一个文件,文件名是:makefile或者Makefile
2.vim打开我们创建的makefile文件,写出以下代码。
第2行是表示依赖关系,用冒号分开,前面表示编译生成后的文件名,后面表示源文件,第3行表示依赖的方法,通过什么样的方式将源文件生成最终文件(需要的文件)。
3.在命令行中输入 make指令,则在该目录下出现了我们编译生成后的文件mycode.c。
然后运行mycode.c文件就可以执行里面的代码。这里会存在几个问题,当你执行完一次make后,在次执行make指令,会提示你:`mycode.c' is up to date.这是正常现象,同一文件没有必要重新编译。如果想要不出现这个提示,mycode.c:test.c这个依赖关系上面加一个.PHONY:mycode.c(一般情况不加上)。.PHONY叫做伪目标,特性是总是会被执行的。在命令行中rm掉mycode.c文件,这个操作是很危险的。我们可以在makefile文件中设置删除的命令。
第6行是依赖关系,只不过clean没有依赖其他文件,这里的clean是我们自己创建的指令(理解为快捷键),第七行是依赖方法。我们只需在命令行中输入 make clean 指令,mycode.c文件就会被删除。
3.注意事项和原理
1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“mycode.c”这个文件,并把这个文件作为最终的目标文件。
3. 如果mycode.c文件不存在,或是mycode.c所依赖的后面的test.c文件的文件修改时间要比mycode.c这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成mycode.c这个文件。
4. 如果mycode.c所依赖的test.c文件不存在,那么make会在当前文件中找目标为test.c文件的依赖性,如果找到则再根据那一个规则生成mycode.c文件。(这有点像一个堆栈的过程)
5. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
6. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
7. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦
8.如果像上面的clean 与mycode.c的依赖关系和方法相反的话,在命令行执行make指令,就会执行删除的指令。