一、了解make/Makefile
对于make/Makefile首先我们需要了解make是一条命令;Makefile是一个文件。
make是一个命令,可以执行某条指令。这个我们理解,那Makefile是一个文件,那这个文件是干什么用的呢?
这个文件内部一共包含两个东西
1、依赖关系
2、依赖方法
我们可以在Makefile这个文件里面写入依赖关系和依赖方法这两个东西。
二、生成可执行
那如何在Makefile里面编写依赖方法和依赖关系呢?
在makefile里面输入依赖关系和依赖方法
执行make命令
三、make原理
make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么:
1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2、如果找到,它会找文件中至顶而下找到第一个目标文件(target),在上面的例子中,他会找到“mytest”这个文件,并把这个文件作为最终的目标文件。
3、如果mytest文件不存在,或是mytest所依赖的后面的mytest.o文件的文件修改时间要比mytest这个文件新,那么,他就会执行后面所定义的命令来生成mytest这个文件。
4、如果mytest所依赖的mytest.o文件不存在,那么make会在当前文件中找目标为mytest.o文件的依赖性,如果找到则再根据那一个规则生成mytest.o文件。(这有点像一个堆栈的过程)
5、当然,你的C文件和H文件是存在的啦,于是make会生成 mytest.o 文件,然后再用mytest.o 文件声明make的终极任务,也就是执行文件mytest了。
6、这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
7、在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
8、make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。
四、程序的清理
mytest程序被删除了。
像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。
五、makefile中的特殊符号
这里$@表示mytest,$^则表示mytest.c