详细写一个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及include文件夹里的c.h,gpio.h引用了include文件夹里的d.h,main.c引用了gpio.h和clk.h。
时间: 2024-03-19 15:45:25 浏览: 107
以下是符合要求的Makefile文件:
```makefile
# Makefile
# 编译器
CC=gcc
# 编译选项
CFLAGS=-Wall -I../include
# 源文件目录
SRCDIR=./
# 目标文件目录
OBJDIR=./obj
# 可执行文件目录
BINDIR=./bin
# 所有的源文件
SRCS=$(wildcard $(SRCDIR)*/*.c) $(wildcard $(SRCDIR)*.c)
# 所有的目标文件
OBJS=$(patsubst $(SRCDIR)%.c, $(OBJDIR)%.o, $(SRCS))
# 可执行文件
TARGET=$(BINDIR)/app
# 将目标文件放到OBJDIR目录下
$(OBJDIR)/%.o: $(SRCDIR)%.c
$(CC) $(CFLAGS) -c $< -o $@
# 编译可执行文件
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $^ -o $@
# 编译clk目录下的源文件
$(OBJDIR)/peripherals/clk/%.o: $(SRCDIR)/peripherals/clk/%.c
$(CC) $(CFLAGS) -c $< -o $@
# 编译gpio目录下的源文件
$(OBJDIR)/peripherals/gpio/%.o: $(SRCDIR)/peripherals/gpio/%.c
$(CC) $(CFLAGS) -c $< -o $@
# 清理目标文件和可执行文件
clean:
rm -rf $(OBJDIR)/*.o $(OBJDIR)/peripherals/clk/*.o $(OBJDIR)/peripherals/gpio/*.o $(TARGET)
# 链接所有目标文件
$(OBJS): | $(OBJDIR)
$(OBJDIR)$(SRCDIR)/peripherals/clk $(OBJDIR)$(SRCDIR)/peripherals/gpio $(BINDIR):
mkdir -p $@
# 编译main.c
$(OBJDIR)/main.o: main.c peripherals/clk/clk.h peripherals/gpio/gpio.h
$(CC) $(CFLAGS) -c $< -o $@
# 编译clk.c
$(OBJDIR)/peripherals/clk/clk.o: peripherals/clk/clk.c peripherals/clk/clk.h ../include/a.h ../include/b.h
$(CC) $(CFLAGS) -c $< -o $@
# 编译gpio.c
$(OBJDIR)/peripherals/gpio/gpio.o: peripherals/gpio/gpio.c peripherals/gpio/gpio.h ../include/c.h
$(CC) $(CFLAGS) -c $< -o $@
```
在这个Makefile中,我们首先定义了编译器和编译选项。然后我们定义了源文件、目标文件和可执行文件的目录。接着,我们定义了所有的源文件和目标文件,可以使用 `wildcard` 和 `patsubst` 函数来自动生成文件列表。在编译目标文件时,我们将目标文件放到 `OBJDIR` 目录下。
在后面的部分中,我们定义了每个目标文件的依赖关系和编译规则。对于 `$(OBJDIR)/%.o` 目标,我们使用了通配符来匹配所有的源文件,并将其编译成相应的目标文件。对于 `$(TARGET)` 目标,我们使用了所有的目标文件来链接可执行文件。
我们还定义了 `$(OBJDIR)/peripherals/clk/%.o` 和 `$(OBJDIR)/peripherals/gpio/%.o` 目标,用于编译 `peripherals/clk` 和 `peripherals/gpio` 目录下的源文件。在编译这些源文件时,我们需要包含上一级目录中的头文件。为了让Makefile自动创建这些目录,我们使用了 `mkdir` 命令。
最后,我们定义了每个目标文件的依赖关系。对于 `$(OBJS)` 目标,我们使用了一个管道符号 `|`,表示在编译 `$(OBJS)` 前需要先创建 `$(OBJDIR)` 目录。对于每个目标文件,我们列出了它所依赖的头文件和源文件,并指定了相应的编译规则。
阅读全文