写一个通用的Makefile ,并详细解释每句话的含义
时间: 2024-02-16 21:03:49 浏览: 65
下面是一个通用的Makefile,包含了常用的编译命令和变量:
```
CC = gcc
CFLAGS = -Wall -Wextra -Werror
SRCDIR = src
INCDIR = include
OBJDIR = obj
BINDIR = bin
SRC = $(wildcard $(SRCDIR)/*.c)
OBJ = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SRC))
EXECUTABLE = $(BINDIR)/my_program
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJ)
$(CC) $(CFLAGS) $(OBJ) -o $@
$(OBJDIR)/%.o: $(SRCDIR)/%.c
$(CC) $(CFLAGS) -I$(INCDIR) -c $< -o $@
clean:
rm -f $(OBJ) $(EXECUTABLE)
```
下面逐行解释每句话的含义:
```
CC = gcc
```
定义一个变量CC,表示使用的编译器是gcc。
```
CFLAGS = -Wall -Wextra -Werror
```
定义一个变量CFLAGS,表示编译时需要开启的选项,这里包括了-Wall、-Wextra、-Werror,分别表示开启所有警告、额外的警告和将警告视为错误。
```
SRCDIR = src
INCDIR = include
OBJDIR = obj
BINDIR = bin
```
定义了一些目录的变量,分别表示源文件目录、头文件目录、目标文件目录和可执行文件目录。
```
SRC = $(wildcard $(SRCDIR)/*.c)
```
使用wildcard函数获取src目录下的所有.c文件,将其保存到变量SRC中。
```
OBJ = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SRC))
```
使用patsubst函数将$(SRCDIR)目录下的所有.c文件替换成$(OBJDIR)目录下的.o文件,将结果保存到变量OBJ中。
```
EXECUTABLE = $(BINDIR)/my_program
```
定义一个变量EXECUTABLE,表示最终生成的可执行文件名为my_program,保存在$(BINDIR)目录下。
```
all: $(EXECUTABLE)
```
定义一个all规则,表示默认的编译规则是生成$(EXECUTABLE)这个可执行文件。
```
$(EXECUTABLE): $(OBJ)
$(CC) $(CFLAGS) $(OBJ) -o $@
```
定义一个$(EXECUTABLE)规则,表示如何生成$(EXECUTABLE)这个可执行文件。其中,$(OBJ)表示依赖的目标文件,$@表示目标文件名,$(CC)表示使用的编译器,$(CFLAGS)表示编译选项。
```
$(OBJDIR)/%.o: $(SRCDIR)/%.c
$(CC) $(CFLAGS) -I$(INCDIR) -c $< -o $@
```
定义一个%.o规则,表示如何生成$(OBJDIR)目录下的.o文件。其中,$<表示依赖的源文件名,-I$(INCDIR)表示头文件的搜索路径。
```
clean:
rm -f $(OBJ) $(EXECUTABLE)
```
定义一个clean规则,表示删除生成的目标文件和可执行文件。其中,rm -f表示强制删除,$(OBJ)和$(EXECUTABLE)分别表示要删除的目标文件和可执行文件。
阅读全文