复杂并有多层的工程怎么写makefile ,并详细说明解释
时间: 2024-02-16 19:03:57 浏览: 180
autotools工具makefile
对于复杂并有多层的工程,需要编写一个复杂的Makefile来管理和编译代码。下面是一个例子,涉及到多个子目录和多个源文件:
```makefile
# 定义编译器和编译选项
CC = gcc
CFLAGS = -Wall -Wextra -Werror -I./include
# 定义源文件目录、目标文件目录和可执行文件目录
SRCDIR = ./src
OBJDIR = ./obj
BINDIR = ./bin
# 定义子目录列表和子目标列表
SUBDIRS = $(SRCDIR)/subdir1 $(SRCDIR)/subdir2
SUBTARGETS = $(addsuffix /subdir1.o, $(SUBDIRS)) $(addsuffix /subdir2.o, $(SUBDIRS))
# 定义源文件列表和目标文件列表
SRCS = $(wildcard $(SRCDIR)/*.c) $(wildcard $(SUBDIRS)/*.c)
OBJS = $(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o, $(SRCS)) $(SUBTARGETS)
# 定义可执行文件名
EXECUTABLE = $(BINDIR)/my_program
# all规则,生成可执行文件
all: $(EXECUTABLE)
# 可执行文件规则,依赖于目标文件
$(EXECUTABLE): $(OBJS)
$(CC) $(CFLAGS) $^ -o $@
# 目标文件规则,依赖于源文件
$(OBJDIR)/%.o: $(SRCDIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
# 子目标规则,递归进入子目录进行编译
$(SUBTARGETS):
$(MAKE) -C $(dir $@)
# clean规则,删除生成的目标文件和可执行文件
clean:
rm -f $(OBJS) $(EXECUTABLE)
# 处理子目录的clean规则
$(SUBDIRS):
$(MAKE) -C $@ clean
```
以上Makefile的主要特点如下:
1. 定义了编译器和编译选项,方便后续的编译操作;
2. 定义了源文件目录、目标文件目录和可执行文件目录,方便管理文件;
3. 定义了子目录列表和子目标列表,方便递归进入子目录进行编译;
4. 定义了源文件列表和目标文件列表,方便管理和编译文件;
5. 定义了all规则,生成可执行文件;
6. 定义了可执行文件规则和目标文件规则,分别依赖于目标文件和源文件;
7. 定义了子目标规则,使用递归方式进入子目录进行编译;
8. 定义了clean规则,删除生成的目标文件和可执行文件;
9. 处理子目录的clean规则,使得可以递归删除子目录的目标文件和可执行文件。
通过上述Makefile,可以方便地管理和编译复杂的多层工程。需要注意的是,Makefile中的每个规则都需要使用Tab键缩进,否则会出现错误。
阅读全文