详细写一个makefile,makefile、main.c、peripherals在同一级目录,include文件夹在makefile的上一级目录,peripherals文件下面有clk和gpio两个文件夹,clk文件夹下有clk.c和clk.h,clk.c引用了clk.h及include文件夹里的a.h、b.h。gpio文件夹下有gpio.c和gpio.h。gpio.c引用了gpio.h。gpio.h引用了include文件夹里的c.h。main.c引用了gpio.h和clk.h
时间: 2024-03-15 08:45:33 浏览: 68
以下是一个可能的 Makefile 实现,可以根据需要进行修改和调整:
```makefile
# 定义变量
CC = gcc
CFLAGS = -Wall -I../include
LDFLAGS =
# 定义源文件和目标文件
SRCDIR = .
OBJDIR = obj
SOURCES = $(wildcard $(SRCDIR)/*.c) $(wildcard $(SRCDIR)/peripherals/clk/*.c) $(wildcard $(SRCDIR)/peripherals/gpio/*.c)
OBJECTS = $(addprefix $(OBJDIR)/,$(notdir $(SOURCES:.c=.o)))
EXECUTABLE = main
# 默认目标
all: $(EXECUTABLE)
# 编译规则
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $^ -o $@
$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
$(CC) $(CFLAGS) -c $< -o $@
$(OBJDIR)/%.o: $(SRCDIR)/peripherals/clk/%.c | $(OBJDIR)
$(CC) $(CFLAGS) -c $< -o $@
$(OBJDIR)/%.o: $(SRCDIR)/peripherals/gpio/%.c | $(OBJDIR)
$(CC) $(CFLAGS) -c $< -o $@
# 创建目录
$(OBJDIR):
mkdir -p $(OBJDIR)
# 清理规则
clean:
rm -rf $(OBJDIR) $(EXECUTABLE)
# 依赖关系
$(OBJDIR)/clk.o: $(SRCDIR)/peripherals/clk/clk.c $(SRCDIR)/peripherals/clk/clk.h ../include/a.h ../include/b.h
$(OBJDIR)/gpio.o: $(SRCDIR)/peripherals/gpio/gpio.c $(SRCDIR)/peripherals/gpio/gpio.h ../include/c.h
$(OBJDIR)/main.o: $(SRCDIR)/main.c $(SRCDIR)/peripherals/clk/clk.h $(SRCDIR)/peripherals/gpio/gpio.h
.PHONY: all clean
```
注意,此 Makefile 的默认目标是 `main`,因此需要将 `main.c` 编译为可执行文件。此外,我们使用了以下技巧:
- `wildcard` 函数可以用来匹配多个文件,例如 `$(wildcard $(SRCDIR)/*.c)` 将匹配 `main.c` 文件。
- `notdir` 函数可以用来提取文件名,例如 `$(notdir main.c)` 将返回 `main.c`。
- `addprefix` 函数可以用来添加前缀,例如 `$(addprefix obj/,main.o)` 将返回 `obj/main.o`。
- `|` 符号可以用来指定先决条件,例如 `$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)` 表示 `$(OBJDIR)` 是先决条件,且只会在需要创建目录时才会执行。
- `.PHONY` 表示这是一个伪目标,不与任何文件相对应。在这个例子中,我们定义了 `all` 和 `clean` 两个伪目标。
阅读全文