大佬文章出处:
https://blog.csdn.net/haoel/article/details/2886
以下是我自己摘出来的一些笔记。
编译:将.c编译为.o。
链接:将.o链接为可执行程序。
(h文件是不参与编译的)
如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
target ... : prerequisites ...
command
...
...
prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。
clean不是一个文件,它只不过是一个动作名字,
make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在make命令后明显得指出这个lable的名字。
这样的方法非常有用,我们可以在一个makefile中定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。
我们知道,Makefile中的第一个目标会被作为其默认目标。我们声明了一个“all”的伪目标,其依赖于其它三个目标。由于伪目标的特性是,总是被执行的,所以其依赖的那三个目标就总是不如“all”这个目标新。
所以,其它三个目标的规则总是会被决议。也就达到了我们一口气生成多个目标的目的。(总是执行,不管时间)
“.PHONY : all”声明了“all”这个目标为“伪目标”。
随便提一句,从上面的例子我们可以看出,目标也可以成为依赖。所以,伪目标同样也可成为依赖。看下面的例子:
.PHONY: cleanall cleanobj cleandiff
cleanall : cleanobj cleandiff
rm program
cleanobj :
rm *.o
cleandiff :
rm *.diff
“make clean”将清除所有要被清除的文件。“cleanobj”和“cleandiff”这两个伪目标有点像“子程序”的意思。我们可以输入“make cleanall”和“make cleanobj”和“make cleandiff”命令来达到清除不同种类文件的目的。
一、变量的基础
变量在声明时需要给予初值,而在使用时,需要给在变量名前加上“$”符号,但最好用小括号“()”或是大括号“{}”把变量给包括起来。如果你要使用真实的“$”字符,那么你需要用“$$”来表示。
在上面的例子中,如果你不想给变量加上括号,那也可以,但我还是强烈建议你给变量加上括号。