文件夹里面有不同的模块
时间: 2023-08-05 20:04:57 浏览: 50
如果文件夹中有不同的模块,需要在Makefile中指定每个模块的源文件和目标文件路径。假设你有以下目录结构:
```
project
├── src
│ ├── main.c
│ ├── module1
│ │ ├── module1.c
│ │ └── module1.h
│ └── module2
│ ├── module2.c
│ └── module2.h
└── bin
```
其中,src目录存放源文件和模块文件,bin目录用于存放生成的目标文件和可执行文件。可以按照以下方式编写Makefile:
```makefile
# 定义源文件和目标文件路径
SRCDIR = src
BINDIR = bin
# 定义模块名称、源文件和目标文件
MODULES = module1 module2
SRCS = $(wildcard $(SRCDIR)/*.c) $(foreach MODULE,$(MODULES),$(wildcard $(SRCDIR)/$(MODULE)/*.c))
OBJS = $(patsubst $(SRCDIR)/%.c,$(BINDIR)/%.o,$(SRCS))
TARGET = $(BINDIR)/myprogram
# 定义编译器和编译选项
CC = gcc
CFLAGS = -Wall -g
# 定义链接选项
LDFLAGS =
# all是Makefile的默认目标,执行make命令时会自动执行all目标
all: $(TARGET)
# 生成可执行文件
$(TARGET): $(OBJS)
$(CC) $(LDFLAGS) $(OBJS) -o $@
# 生成目标文件
$(BINDIR)/%.o: $(SRCDIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
# 生成模块目标文件
$(BINDIR)/%.o: $(SRCDIR)/%/%.c
$(CC) $(CFLAGS) -c $< -o $@
# clean目标用于清理中间文件和目标文件
clean:
rm -f $(OBJS) $(TARGET)
```
在上述Makefile中,首先定义了模块名称、源文件和目标文件,通过$(foreach)和$(wildcard)函数自动搜索和转化文件路径。然后定义了编译器和编译选项,以及链接选项。接着定义了all目标,它依赖于$(TARGET)目标,$(TARGET)目标依赖于$(OBJS)目标。其中,$(TARGET)目标用于生成可执行文件,$(OBJS)目标用于生成目标文件,$(BINDIR)/%.o目标用于生成模块目标文件。最后定义了clean目标,用于清理中间文件和目标文件。
在命令行中执行make命令时,会自动执行Makefile中的all目标,即生成可执行文件。如果需要清理中间文件和目标文件,可以执行make clean命令。