Linux Makefile由浅入深剖析
原创Linux Makefile由浅入深剖析
Makefile是Linux系统中用于自动化构建项目的一种脚本文件,它通过定义一系列规则来指导编译器怎样编译源代码文件,生成可执行文件。本文将深入剖析Linux Makefile的各个方面,帮助读者从入门到精通。
1. Makefile的基本结构
Makefile的基本结构如下:
# 注释
# 变量定义
VARIABLE := value
# 目标文件定义
TARGET: DEPENDENCIES
COMMAND
# 其他目标文件定义
其中,注释、变量定义、目标文件定义和命令是Makefile的核心部分。
1.1 注释
Makefile中的注释以井号(#)开头,用于说明代码的功能或作用。例如:
# 编译规则
1.2 变量定义
变量用于存储值,在Makefile中可以定义各种变量,如:
# 变量定义
CC := gcc
CFLAGS := -Wall -g
变量定义后,可以使用$(VARIABLE)的形式来引用变量的值。
1.3 目标文件定义
目标文件定义了Makefile中的目标,如可执行文件、库文件等。目标文件以冒号(:)开头,后面跟着依赖性文件和命令。例如:
# 目标文件定义
all: main.o util.o
gcc main.o util.o -o program
在这个例子中,目标文件名为“all”,依赖性文件为“main.o”和“util.o”,命令为将这两个目标文件编译成可执行文件“program”。
1.4 命令
命令用于指定在目标文件生成过程中需要执行的命令。例如,上面的例子中的命令是使用gcc编译器将main.o和util.o编译成可执行文件program。
2. Makefile的规则
Makefile中的规则定义了目标文件与依赖性文件之间的关系,以及怎样生成目标文件。规则的基本格式如下:
TARGET: DEPENDENCIES
COMMAND
其中,TARGET为目标文件,DEPENDENCIES为依赖性文件,COMMAND为生成目标文件时需要执行的命令。
2.1 自动变量
Makefile中提供了一些自动变量,用于简化规则编写。以下是一些常用的自动变量:
自动变量 | 说明 |
---|---|
$@ | 目标文件名 |
$^ | 所有依赖性文件名 |
$< | 第一个依赖性文件名 |
$? | 比目标文件新或修改过的依赖性文件名 |
例如,使用自动变量简化上面的规则:
all: main.o util.o
gcc $^ -o $@
2.2 通配符
Makefile中可以使用通配符来匹配多个文件。常用的通配符有*和?。
# 匹配所有.c文件
all: $(wildcard *.c)
gcc $(wildcard *.c) -o program
3. Makefile的高级特性
3.1 文件搜索
Makefile可以使用vpath变量来指定搜索依赖性文件的目录。例如:
vpath %.c src:include
这个例子中,Makefile会在src和include目录下搜索.c文件作为依赖性文件。
3.2 条件判断
Makefile可以使用if语句进行条件判断。例如:
ifeq ($(CC),gcc)
CFLAGS += -Wall -g
else
CFLAGS += -O2
endif
3.3 循环
Makefile可以使用for循环遍历文件列表。例如:
for i in $(wildcard *.c)
do
$(CC) $(CFLAGS) -c $i -o $(@:.c=.o)