Makefile语法
文章目录
- 使用
- 符号
- 变量
- 函数
- $(foreach var, list, text)
- $(filter pattern..., text)
- $(filter-out pattern..., text)
- $(wildcard pattern)
- $(patsubst pattern, replacement, $(var))
- 依赖
- CFLAGS
使用
make 【目标】
若不加目标,默认执行第一个目标
符号
- 通配符 %
- $@ 表示目标
- $< 表示第一个依赖文件
- $^ 表示所有依赖文件
.PHONY:【目标】 防止同名
变量
-
即时变量(简单变量),延时变量
-
-
变量使用: $(变量名)
函数
$(foreach var, list, text)
- 功能:遍历 list 中的每个元素,将其赋值给变量 var,然后对 text 进行展开(text 中可以使用 var 引用当前遍历的元素),最后将所有展开结果拼接成一个新的字符串列表。
- 示例:
names := Alice Bob Charlie
greetings := $(foreach name, $(names), Hello $(name))
#最终 greetings 的值为 "Hello Alice Hello Bob Hello Charlie"
$(filter pattern…, text)
- 功能:从 text(通常是由空格分隔的字符串列表)中,筛选出符合 pattern(可以是通配符模式,多个模式用空格分隔)的字符串,组成新的列表。
files := a.c b.h c.c d.txt
c_files := $(filter %.c, $(files))
# 最终 c_files 的值为 "a.c c.c"
$(filter-out pattern…, text)
- 功能:与 filter 相反,从 text 中筛选出不符合 pattern 的字符串,组成新的列表
files := a.c b.h c.c d.txt
non_c_files := $(filter-out %.c, $(files))
# 最终 non_c_files 的值为 "b.h d.txt"
$(wildcard pattern)
- 功能:在当前目录下,匹配符合 pattern(通配符模式,如 *.c 匹配所有 .c 文件)的文件,返回存在的文件列表(由空格分隔)。如果不用 wildcard,Makefile 不会自动展开通配符(会把 *.c 当作普通字符串处理)
src_files := $(wildcard *.c)
# 假设当前目录有 a.c、b.c,那么 src_files 的值为 "a.c b.c"
$(patsubst pattern, replacement, $(var))
- 功能:对变量 var 中的每个元素(元素间以空格分隔),如果符合 pattern(可以包含通配符,类似 %.c),就将其替换为 replacement(replacement 中可以用 % 引用 pattern 中匹配的部分),最终得到替换后的字符串列表。
src_files := a.c b.c
obj_files := $(patsubst %.c, %.o, $(src_files))
# 最终 obj_files 的值为 "a.o b.o"
依赖
CFLAGS
- 主要用途
- 指定编译选项:控制编译器行为
- 定义宏:在编译时传递宏定义
- 设置警告级别:控制编译器输出的警告信息
- 指定优化等级:控制代码优化程度
- 指定头文件搜索路径:告诉编译器去哪里找头文件
# 启用所有警告并将警告视为错误
CFLAGS="-Wall -Werror"# 启用优化(等级 2)
CFLAGS="-O2"# 定义宏 DEBUG(等价于代码中的 #define DEBUG)
CFLAGS="-DDEBUG"# 添加头文件搜索路径
CFLAGS="-I/usr/local/include -I./include"# 生成调试信息(供 gdb 使用)
CFLAGS="-g"# 综合示例
CFLAGS="-Wall -O2 -g -I./include -DVERSION=1.0"
使用示例
CFLAGS = -Wall -O2 -I./includeall: myprogrammyprogram: main.o utils.ogcc $(CFLAGS) -o myprogram main.o utils.omain.o: main.cgcc $(CFLAGS) -c main.cutils.o: utils.cgcc $(CFLAGS) -c utils.c