-----仅作为学习笔记
1.什么是make工具?
编译辅助工具。解决使用命令编译工程非常繁琐的问题。
2.怎么调用make工具?
直接在控制台输入make命令,就会调用make工具。
3.什么是makefile?
makefile就是描述了整个工程编译连接等规则的文件。makefile的命令必须是makefile或者Makefile。
4.Makefile基本语法
语法格式:
目标:依赖
(tab)命令
举例:
目标:all
依赖:空
命令:gcc hello.c -o hello
上面的例子也可以写成:
目标:all和hello.o
依赖:hello.o和hello.c
命令:gcc hello.c -o hello 和 gcc -c hello.c
因为all依赖hello.o文件,所以要先执行gcc -c hello.c得到hello.o文件,然后才可以执行gcc hello.c -o hello。所以输入make命令后执行顺序如下。
在编译的时候,我们可以使用make目标来编译,如果我们不指定目标的话,默认执行的是第一个目标所对应的规则。也就是说make和make all是一样的。如上面的例子。
接下来,我们使用make目标的方法来编译。我们修改Makefile代码如下:
然后我们输入命令make clean就可以直接执行 rm -rf *.o hello命令。如下图所示:
但是,我们在当前目录下不能有和Makefile目标名一样的文件。比如我在当前目录下创建一个名为clean的文件,然后在执行make clean命令就会报错。如下图所示:
为了解决这个问题,makefile引入了一个新的概念,叫做伪目标,我们使用伪目标来声明clean就可以避免与当前目录下的同名文件发生冲突。
伪目标格式:
.PHONY:目标
所以,我们可以把上面的代码修改成如下图所示:
然后我们再执行make clean命令。尽管当前目录下有clean同名文件,make clean命令也可以执行成功。如下图所示:
5.Makefile变量和变量赋值
变量可以在许多地方使用,比如目标,依赖,或者命令。
变量的赋值可以使用:= ?= := +=
变量的使用:通过$()来完成变量的引用。
示例1:
使用:=来赋值
使用:=来给变量赋值,是立刻赋值,在执行var:=aaa的同时,变量值已经被确定了,所以最后打印为aaabbb,而不是cccbbb
示例2:
使用=来赋值
使用=来给变量赋值,是延时赋值,使用它来赋值是makefile里面最后被指定的值。因为我们最后变量var1赋值为ccc,所以最后打印为cccbbb,而不是aaabbb,如下图所示:
示例3:
使用?=来赋值
使用?=来赋值的意思为,如果var1变量前面没有被赋值,那么就给他赋值为ccc,如果前面已经赋值了,就使用前面的值,所以打印为aaabbb,而不是cccbbb,如下图所示。
然后我们注释掉第一行代码,makefile中的注释为#
再运行就会打印cccbbb,因为前面没有给var1变量赋值。如下图所示:
示例4:使用+=来赋值
使用+=来赋值是追加赋值,是在我们前面定义好的字符串里面再添加进去新的字符串,所以运行会打印aaa bbbccc。不过中间会有空格,如下图所示:
使用+=也类似与我们这样赋值,如下图所示:
如果赋值很长,我们也可以使用换行符/,如下图所示: