1、 Makefile的定义
- ?=若变量未定义,则定义;+=在变量后面追加;:=和=均为赋值符号(其中,=是最基本的赋值,会将Makefile全部展开后决定对应的值,而:=表示变量的值取决于当前在Makefile里面的位置)。
- Makefile里面的一些控制语句记得敲空格,小括号里面不能加空格(这个和sheel不一样);想调用shell脚步赋值,可以这样写PWD := $(shell pwd).
总结:Makefile和sheel脚步有很多类似之处(比如=号赋值),当然了也是有比较多的区别的,
区别总结如下:
①、makefile里面取变量值可以是$()和$[],如果是单个字符可以$a。但在sheel中意义不一样了,$var和${var}没有什么不一样,但后者有更精确的命名空间,最关键的区别是$()会命令替换,有些类似于反引号。
2、 Makefile的规则
make命令执行时,需要一个Makefile文件,以用来告诉make命令需要怎么样去编译和链接,规则是:
- 如果这个工程没有编译过,那么所有的c文件都要编译并链接。
- 如果这个工程的c文件被修改过,那么我们只编译被修改过的c文件,并链接目标程序。
- 如果这个工程的头文件被改变了,那么我们只需要编译引用这个头文件的c文件,并编译链接。(具体怎么知道头文件修改了,需要在编译时把头文件列出来)
3、 Makefile的通配符
wildcard扩展通配符:SOURCE += $(wildcard *.c)获取工作目录下的所有.c文件。
patsubst替换通配符:OBJECTS = $(patsubst %.c,%.o,&(SOURCE)或者OBJECTS = $(SOURCE:%.c=%.o)
通配符通常发生在以下时刻:
- 在规则的目标、依赖中的通配符,make在读取Makefile时自动为其进行匹配处理(即展开),规则是由make去管理的。
- 在规则的命令中的通配符不需要make来操心,它们总是由shell来展开。
- 除了上面两点之外的其他地方(如变量定义),不能直接使用统配符,只能通过wildcard来达到目的,得到以后就可以用静态模式了。
4、 Makefile的静态模式
其中%.c到%.o是通配符转换,其中在实际编码时target可以是不需要的。