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)
编译结果: