makefile 多级目录编译
时间: 2023-07-31 19:12:32 浏览: 98
在 Makefile 中编译多级目录的代码,可以使用以下步骤:
1. 定义变量
定义变量来存储源代码和目标代码的路径,如:
```
SRCDIR = src
BINDIR = bin
```
2. 设置编译规则
设置编译规则来编译源代码并生成目标代码,如:
```
$(BINDIR)/%.o: $(SRCDIR)/%.c
$(CC) -c $< -o $@
```
这个规则表示,将 $(SRCDIR) 目录下的所有 .c 文件编译成 $(BINDIR) 目录下的 .o 文件。
3. 设置链接规则
设置链接规则来生成可执行文件,如:
```
app: $(OBJS)
$(CC) $(OBJS) -o app
```
这个规则表示,将 $(BINDIR) 目录下的所有 .o 文件链接成可执行文件 app。
4. 定义依赖关系
定义依赖关系来确保编译的顺序正确,如:
```
OBJS = $(BINDIR)/foo.o $(BINDIR)/bar.o $(BINDIR)/baz.o
$(BINDIR)/foo.o: $(SRCDIR)/foo.c $(SRCDIR)/foo.h
$(BINDIR)/bar.o: $(SRCDIR)/bar.c $(SRCDIR)/bar.h
$(BINDIR)/baz.o: $(SRCDIR)/baz.c $(SRCDIR)/baz.h
```
这些规则表示,$(BINDIR)/foo.o 依赖于 $(SRCDIR)/foo.c 和 $(SRCDIR)/foo.h,$(BINDIR)/bar.o 依赖于 $(SRCDIR)/bar.c 和 $(SRCDIR)/bar.h,$(BINDIR)/baz.o 依赖于 $(SRCDIR)/baz.c 和 $(SRCDIR)/baz.h。
5. 编写完整的 Makefile
根据以上步骤,编写完整的 Makefile。例如:
```
CC = gcc
SRCDIR = src
BINDIR = bin
SRCS = $(wildcard $(SRCDIR)/*.c)
OBJS = $(patsubst $(SRCDIR)/%.c,$(BINDIR)/%.o,$(SRCS))
app: $(OBJS)
$(CC) $(OBJS) -o app
$(BINDIR)/%.o: $(SRCDIR)/%.c
$(CC) -c $< -o $@
$(BINDIR)/foo.o: $(SRCDIR)/foo.c $(SRCDIR)/foo.h
$(BINDIR)/bar.o: $(SRCDIR)/bar.c $(SRCDIR)/bar.h
$(BINDIR)/baz.o: $(SRCDIR)/baz.c $(SRCDIR)/baz.h
```
这个 Makefile 可以编译 $(SRCDIR) 目录下的所有 .c 文件,并将生成的 .o 文件存放在 $(BINDIR) 目录下,最后将所有 .o 文件链接成可执行文件 app。同时,它还定义了每个 .o 文件的依赖关系。
阅读全文