背景:
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作
- makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
- make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。
- make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建
使用方法:
创建makefile文件,使用vim 在makefile文件中进行编辑
工作原理:
- make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
- 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到mytest这个文件, 并把这个文件作为最终的目标文件,进行执行。
- 同时在执行的过程中,make会检测这个目标文件是否有必要进行执行,就比如:执行的目标文件是clean,文件的依赖方法是清除某一个指定的文件,当这个文件清除后,再次使用make进行执行时,make会发出提示,因为他找不到要删除的文件了。
- 同理对于其他文件来说,make会查看该文件的可执行文件和源文件的更新时间,如果源文件的时间更新则进行make,而可执行文件的时间更新则不执行make
- 多次执行命令而不想要make的提示则需要 输入 .PHONY:目标文件 即可进行重复的执行目标文件下的依赖方法
- 因为make 是默认执行makefile中的第一个目标文件,若想要执行其他的目标文件则需要 make 目标文件名 即可。
内置符号
@表示目标文件,^表示依赖文件列表,$表示取出的意思,就如下图所示$@ 表示 code.exe,$^ 表示code.c
特殊的工作原理
这里make虽然是从上扫描到下的,但是make找到目标文件后,发现里面的依赖文件不存在就不会指向它的依赖方法,然后就会往下查找下面的目标文件,直到找到存在的依赖文件,然后实现,又因为在该makeflie中 有了.i就有了.s有了等等就和递归值返回一样,其他的依赖关系依次实现,使得上面的依赖关系都展开了
换种说法就是如果make寻找的目标文件中的依赖文件不存在,就会入栈,直到有了这个依赖文件就会出栈同样如果是乱序,make也有可能会进行入栈和递归这类操作 ,不过,必须要把最重要的最后一步的文件放在开头。
makefile支持变量定义
左侧是变量名,右侧是变量的内容,也就说变量的值,同时可以用变量名代替替换的内容
可以在依赖方法前加上@就可以在使用make时不显示依赖方法