C笔记-GNU Make 基础

作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!

当代码数量达到程序后,项目的编译,链接,生成目标文件不再是一两行命令的事情。这个时候,GNU Make就派上用场了。

Makefile查找规则 | Makefile lookup rules

默认的情况下,make 会在工作目录(执行make 的目录)下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”。不推荐使用“GNUmakefile”这个文件名,因为以此命名的文件只有“GNU make”才可以识别,而其他版本的make程序只会在工作目录下“makefile”和“Makefile”这两个文件。

“make”编译规则 | “make” compilation rules

1、C源代码文件在上次make之后有修改,本次make时会重新编译。
2、C头文件在上次make之后有修改,在本次make时所有包含此头文件的C源代码文件都会重新编译。

Makefile语法格式 | Makefile syntax format

Makefile 描述规则格式:

1
2
TARGET: PREREQUISITES
COMMAND

说明:

  • target:规则的目标。
  • prerequisites:规则的依赖
  • command:规则的命令行

1、每一个命令行必须以[Tab]字符开始,[Tab]字符告诉 make 此行是一个命令行。make按照命令完成相应的动作。这也是书写Makefile 中容易产生,而且比较隐蔽的错误。
2、在书写时,一个较长行可以使用反斜线(\)分解为多行,这样做可以使Makefile清晰、容易阅读。注意:反斜线之后不能有空格(这也是大家最容易犯的错误,而且错误比较隐蔽)。
3、Makefile中把那些没有任何依赖只有执行动作的目标称为“伪目标”(phony targets)。
4、默认的情况下,make执行Makefile中的第一个规则
5、Makefile 中“#”字符后的内容被作为是注释内容。如果此行的第一个非空字符为“#”,那么此行为注释行。注释行的结尾如果存在反斜线(\),那么下一行也被作为注释行

自动推导规则 | Automatic derivation rules

在使用make编译.c源文件时,可以省略编译一个.c文件所使用的命令。这是因为make存在一个默认的规则,能够自动完成对.c文件的编译并生成对应的.o文件。

1
main.o: hello.h

等同于

1
2
main.o: hello.h
gcc -o main.o main.c hello.h

伪目标 | Phony target

1
2
3
.PHONY: clean
clean:
-rm edit $(objects)

1)通过“.PHONY”特殊目标将“clean”目标声明为伪目标。防止当磁盘上存在一个名为“clean”文件时,“clean”所在规则的命令无法执行
2)在命令行之前使用“-”,意思是忽略命令“rm”的执行错误