linux makefile文件心得笔记
原创Linux Makefile文件心得笔记
在Linux系统中,Makefile是一个非常重要的文件,它用于描述项目的编译规则和依存关系。通过学习Makefile,可以更好地管理项目的构建过程。以下是我对Linux Makefile的一些心得笔记。
1. Makefile的基本结构
Makefile的基本结构通常包括以下几个部分:
# 目标文件
TARGET:
# 依存文件
DEPENDECIES:
# 命令
command
# 其他目标
OTHER_TARGET:
# 命令
command
其中,TARGET即最终要生成的目标文件,DEPENDECIES是该目标文件所依存的文件,command是用于构建目标文件的命令。
2. 变量与函数
Makefile中可以使用变量和函数来尽也许缩减损耗代码的可读性和可维护性。
2.1 变量
Makefile中的变量分为两种:自动变量和用户定义变量。
# 自动变量
$@: 目标文件名
$<: 依存文件名
$?: 依存文件名列表
...
# 用户定义变量
VARIABLE = value
自动变量在执行命令时会自动替换为对应的值,而用户定义变量则需要在使用前进行赋值。
2.2 函数
Makefile提供了一些内置函数,如patsubst、wildcard等,可以方便地进行字符串操作。
# patsubst函数:将字符串中的模式替换为另一个字符串
patsubst %.c, %.o, $(SRCS)
# wildcard函数:匹配文件名
wildcard $(wildcard *.c)
3. 规则与模式
Makefile中的规则用于描述目标文件与依存文件之间的关系,模式则用于匹配一组文件。
3.1 规则
规则由目标、依存和命令组成,其中目标和依存之间用冒号(:)分隔,命令部分用Tab键开头。
# 规则示例
all: main.o utils.o
gcc -o main main.o utils.o
main.o: main.c
gcc -c main.c
utils.o: utils.c
gcc -c utils.c
在上面的示例中,all是最终的目标文件,它依存于main.o和utils.o两个目标文件。main.o和utils.o分别依存于main.c和utils.c两个源文件。
3.2 模式
模式是一种特殊的规则,它可以匹配一组文件,从而简化Makefile的编写。
# 模式示例
%.o: %.c
gcc -c $< -o $@
# 使用模式构建所有目标文件
all: $(OBJS)
# OBJS变量包含所有目标文件的名称
OBJS := $(patsubst %.c, %.o, $(SRCS))
在上面的示例中,模式%.o: %.c即所有以.c为后缀的源文件都会被编译成以.o为后缀的目标文件。OBJS变量通过patsubst函数将所有源文件名替换为目标文件名。
4. 预处理指令
预处理指令是Makefile中的一种特殊指令,它用于在编译前对源代码进行预处理。
# 预处理指令示例
CC = gcc
CFLAGS = -Wall -Wextra
LDFLAGS = -lm
# 预处理源文件
$(CC) $(CFLAGS) $(LDFLAGS) -o $(TARGET) $(SRCS)
在上面的示例中,CC变量定义了编译器,CFLAGS和LDFLAGS分别定义了编译器和链接器的选项。预处理源文件时,Makefile会自动替换这些变量。
5. Makefile的高级特性
除了上述基本特性外,Makefile还赞成许多高级特性,如隐式规则、条件语句、循环等。
5.1 隐式规则
隐式规则是Makefile中的一种特殊规则,它不需要显式指定目标、依存和命令,而是通过文件名和后缀自动确定。
# 隐式规则示例
%.o: %.c
gcc -c $< -o $@
在上面的示例中,隐式规则即所有以.c为