makefile速通
文章目录
- makefile速通
- 1.基础
- 显式规则
- 隐含规则
- %
- *
- 通配符
 
- 赋值
- =
 
- 伪目标
- CFLAGS
 
 
- 2.函数
- wildcard
- patsubst
 
- 3.项目实例
 
1.基础
显式规则
目标文件:依赖文件
[TAB] 指令
隐含规则
%
任意
*
所有
通配符
| 符号 | 含义 | 
|---|---|
| $^ | 所有依赖文件 | 
| $@ | 所有目标文件 | 
| $< | 所有依赖文件的第一个文件 | 
赋值
=
替换
:=
恒等于
?=
赋过值跳过,否则赋值
+=
追加
伪目标
.PHONY
执行操作而不产生中间文件的目标
.PHONY:clean
clean:rm -f $(OBJECTS)  $(TAGET)
CFLAGS
`CFLAGS` 是一个用于指定编译器选项的环境变量,常见于 C 语言的编译过程中。它通常用于传递给编译器(如 `gcc`)的额外选项,用来控制编译过程的行为。
`CFLAGS` 可以用来设置优化级别、调试信息、警告级别等。
常见的 CFLAGS 选项:
- 优化选项: - -O0:关闭优化,通常用于调试。
- -O1,- -O2,- -O3:开启不同级别的优化。- -O2是默认推荐的优化级别,- -O3提供最高优化(可能会增加编译时间和二进制大小)。
- -Os:优化生成更小的代码,减少程序大小。
- -Ofast:启用不保证标准合规性的优化,可能会使程序更快,但不一定与标准兼容。
 
- 调试选项: - -g:生成调试信息,允许使用调试工具(如- gdb)调试程序。通常和- -O0一起使用以保持源码的清晰性。
 
- 警告选项: - -Wall:开启大多数常见的警告信息。
- -Wextra:开启更多的警告信息,比- -Wall更严格。
- -Werror:将警告视为错误,编译器在出现警告时会停止编译。
 
- 标准与兼容性: - -std=c99:使用 C99 标准编译源代码。
- -std=c11:使用 C11 标准编译源代码。
- -ansi:启用 ANSI C 标准(即 C89)。
 
- 其他选项: - -D<macro>:定义宏常量,如- -DDEBUG用于在代码中启用调试相关的宏。
- -I<dir>:指定额外的头文件搜索路径,通常用于包含自定义的头文件。
- -L<dir>:指定额外的库搜索路径,通常用于链接自定义的库。
- -l<lib>:指定链接的库文件,如- -lm用于链接数学库。
 
示例:
CFLAGS = "-O2 -Wall -g -std=c99"
-  这个命令设置了以下选项:-O2:开启优化级别 2。 -Wall:开启所有常见的警告。 -g:生成调试信息。 -std=c99:使用 C99 标准编译代码。
在 Makefile 中使用 CFLAGS
在 Makefile 中,通常会在编译规则中使用 CFLAGS 变量。例如:
CC = gcc
CFLAGS = -O2 -Wall -g -std=c99main: main.c$(CC) $(CFLAGS) -o main main.c
2.函数
wildcard
patsubst
3.项目实例
项目目录结构:

一级目录下:
.PHONY: app cleanSUB_PATH_APP = ./src/app
CROSS_COMPILE_PATH := /home/yckt/x2000_data_logger/sdk/X2000/sdk/prebuilts/toolchains/mips-gcc720-glibc229/bin/mips-linux-gnu-
export CROSS_COMPILE_PATH
app:$(MAKE) -C $(SUB_PATH_APP) ARCH=$(ARCH)clean:$(MAKE) -C $(SUB_PATH_APP) clean
二级app目录下:
.PHONY:clean arm allexport TARGET := x2000_data_loggerARCH ?= armBUILD_PATH := ../../../build
OUT_PATH := ../../../out
CROSS_COMPILE_PATH := /home/yckt/x2000_data_logger/sdk/X2000/sdk/prebuilts/toolchains/mips-gcc720-glibc229/bin/mips-linux-gnu-
export CROSS_COMPILE_PATHifeq ($(ARCH),x86)
CC = gcc
else
CC = $(CROSS_COMPILE_PATH)gcc
endifFINAL_TAGET := $(OUT_PATH)/$(TARGET)CFLAGS := -Wall -O2 -lpthreadSOURCES = $(wildcard *.c)
HEADERS = $(wildcard *.h)
OBJECTS = $(patsubst %.c, $(BUILD_PATH)/%.o, $(SOURCES))all: $(FINAL_TAGET)$(BUILD_PATH)/%.o: %.cmkdir -p $(dir $@)$(CC) $(CFLAGS) -c $< -o $@$(FINAL_TAGET): $(OBJECTS)mkdir -p $(dir $@)$(CC) $(CFLAGS) -o $@ $^clean:rm -f $(OBJECTS) $(FINAL_TAGET)编译结果:
