Makefile是什么?
gcc hello.c -o hello
gcc aa.c bb.c cc.c dd.c ...
make工具和Makefile
make和Makefile是什么关系?
make工具:找出修改过的文件,根据依赖关系,找出受影响的相关文件,最后按照规则单独编译这些文件。
Makefile文件:记录依赖关系和编译规则。
必须要学精Makefile吗?
怎么学习Makefile?
Makefile的本质:无论多么复杂的语法,都是为了更好地解决项目文件之间的依赖关系。
Makefile三要素是什么?
目标、依赖、命令
怎么描述三要素的关系?
目标:依赖的文件或者是其他目标
<tab>命令1
<tab>命令2
<tab>...
实验演示
.PHONY:可以指定伪目标
Makefile的变量、模式匹配
变量
系统变量
CC变量是Makefile的一个系统变量,指代编译器
自定义变量
=,延迟赋值
:=, 立即赋值
?=,空赋值
+=,追加赋值
自动化变量
$<:第一个依赖文件
$^:全部的依赖文件
$@:目标
模式匹配
%:匹配任意多个非空字符
shell:*通配符
默认规则
.o文件默认使用.c文件来进行编译
Makefile条件分支
条件分支
ifeq (var1,var2) ... else ... endif
ifneq (var1,var2) ... else ... endif
Makefile的常用函数
Makefie官方手册:
GNU Make Manual - GNU Project - Free Software Foundation
patsubst:
$(patsubst %.c,%.o,x.c.c bar.c)
把字符“x.c.c bar.c”中以.c结尾的单词替换成以.o结尾的字符。函数的返回结果是“x.c.o bar.o”
notdir:
$(notdir src/foo.c hacks)
返回值为:foo.c hacks
wildcard:
$(wildcard *.c)
返回值为当前目录下所有.c文件
foreach:
dirs :=a b c d
$(foreach dir,$(dirs),$(wildcard $(dir)/*))
返回值是dirs目录下的所有文件dir/*
Makefile解决头文件依赖
1、写一个头文件,并把头文件添加到编译器的头文件路径中。
gcc -I +"头文件"
2、实时检查头文件的更新情况,一旦头文件发生变化,应该要重新编译所有相关文件。
gcc -MM