Makefile 笔记
001_Makefile引入
gcc -o main main.c sub.c
Makefile的核心---规则:
目标 : 依赖1 依赖2 ...
[TAB]命令
main.0:main.c
gcc -c -o mian.o main.c
当“目标文件”不存在,或者某个依赖文件比目标文件“新”,就执行“命令”
002_基本语法
% 通配符
$@ 目标文件
$< 第一个依赖文件
$^ 所有依赖文件
PHONY 定义假想目标,make时可以带目标,如果目标和makefile中的函数重名就会将函数名错误地解读为目标
.PHONY: foo
foo:
rm *.o
003_变量
:= 即时变量,定义的时候就被确定
= 延时变量,值在使用到是才确定
?= 延时变量,如果是第一次定义才起效,如果在前面该变量已经定义则忽略此定义
+= 附加,它是即时变量还是延时变量取决于前面的定义
004_Makefile函数
$(foreach var,list,text)
$(filter pattern...,text) //从text中取出匹配pattern之一的文本
$(filter-out pattern...,text) //从text中过滤掉匹配pattern之一的文本
$(wildcard pattern...) //pattern定义了文件名的格式,wilward将取出其中存在的文件
$(patsubst pattern,replacement,text) //从列表中取出每一个值,如果符合pattern,则替换为replacement
005_makefile支持头文件
gcc -M c.c //打印依赖文件
gcc -M -MF c.d c.c //把依赖文件写入文件c.d
gcc -c -o c.o c.c -MD -MF c.d //编译生成c.o,并把依赖文件写入c.d
006_添加CFLAGS
添加编译选项
-I $(shell pwd)/include //指定要包含的头文件的路径为当前目录下的 include 文件夹
-i //指定要包含的头文件,一般使用,而是在源文件中包含s
-L //指定要包含的库文件的路径
-l //指定要包含的库文件
-D //定义宏