Makefile 的详细用法
时间: 2023-12-14 19:38:11 浏览: 74
Makefile 是一种用于自动化编译和构建软件的工具。它通常用于编译 C、C++、Java 等程序,但也可以用于其他编程语言。在 Makefile 中,你可以定义目标、规则和变量,使得编译和构建过程更加简单和自动化。下面是 Makefile 的详细用法:
1. 定义变量
在 Makefile 中,你可以使用变量来存储文件名、目录名、编译器路径等信息。变量的定义格式为 VARIABLE_NAME = variable_value。例如:
```
CC = gcc
CFLAGS = -Wall -O2
```
其中,CC 和 CFLAGS 分别是编译器和编译选项的变量名,gcc 和 -Wall -O2 分别是变量的值。
2. 定义目标
在 Makefile 中,目标通常是指需要编译的文件或者任务。目标的定义格式为:
```
target: dependencies
commands
```
其中,target 是目标名称,dependencies 是 target 的依赖项,commands 是执行 target 的命令。例如:
```
hello.o: hello.c
$(CC) $(CFLAGS) -c hello.c
```
这个目标将会编译 hello.c 文件,并生成 hello.o 目标文件。
3. 定义伪目标
有些目标并不会生成任何文件,只是用来执行一些任务,比如清理编译生成的文件。这种目标叫做伪目标。在 Makefile 中,你可以使用 .PHONY 关键字来定义伪目标。例如:
```
.PHONY: clean
clean:
rm -f *.o
```
这个伪目标将会删除所有的 .o 文件。
4. 定义规则
在 Makefile 中,规则通常是指一组命令,用于完成一些特定的任务,比如编译、链接、打包等。规则的定义格式为:
```
rule_name: dependencies
commands
```
其中,rule_name 是规则名称,dependencies 是该规则的依赖项,commands 是执行该规则的命令。例如:
```
tarball: $(OBJS)
tar cvf myprog.tar $(OBJS)
```
这个规则将会打包所有的目标文件到 myprog.tar 文件中。
5. 定义通配符
通配符可以用来匹配文件名,比如 *.c 表示所有以 .c 结尾的文件。在 Makefile 中,你可以使用通配符来定义变量和目标。例如:
```
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c,%.o,$(SRCS))
```
其中,$(wildcard *.c) 会把当前目录下所有的 .c 文件名存储到 SRCS 变量中,$(patsubst %.c,%.o,$(SRCS)) 会把 SRCS 中的 .c 文件替换成 .o 文件,并存储到 OBJS 变量中。
6. 定义条件语句
在 Makefile 中,你可以使用条件语句来根据不同的条件执行不同的命令。条件语句的格式为:
```
ifeq (condition1, condition2)
commands
else
commands
endif
```
其中,condition1 和 condition2 是两个条件表达式,commands 是根据条件执行的命令。例如:
```
ifeq ($(DEBUG),yes)
CFLAGS += -g
else
CFLAGS += -O2
endif
```
这个条件语句会根据 DEBUG 变量的值来确定编译选项。
7. 定义函数
在 Makefile 中,你可以使用函数来处理变量和命令。函数的格式为:
```
$(function arguments)
```
其中,function 是函数名,arguments 是函数的参数。例如:
```
OBJS = $(patsubst %.c,%.o,$(wildcard *.c))
all: $(call print_msg,Compiling...) $(OBJS)
$(CC) $(CFLAGS) -o myprog $(OBJS)
print_msg = echo $1
```
这个 Makefile 定义了一个 print_msg 函数,用于输出一条编译信息。all 目标会先执行 print_msg 函数,然后编译所有的 .c 文件。
以上是 Makefile 的详细用法,通过定义变量、目标、伪目标、规则、通配符、条件语句和函数,你可以更加自动化地编译和构建软件。
阅读全文