多目录makefile怎么写
时间: 2023-10-13 10:56:06 浏览: 50
对于多目录的情况,我们可以使用一个主makefile来管理整个项目,然后在每个子目录下再编写各自的makefile。以下是一个示例:
首先,我们创建一个名为`Makefile`的主makefile,并在其中定义一些变量和规则:
```makefile
# 定义子目录
SUBDIRS := dir1 dir2 dir3
# 定义编译器和编译选项
CC := gcc
CFLAGS := -Wall -Werror
# 定义目标文件存放的目录
OBJDIR := obj
# 定义目标文件和可执行文件
TARGET := myprogram
OBJS := $(addprefix $(OBJDIR)/, file1.o file2.o file3.o)
.PHONY: all clean $(SUBDIRS)
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $^ -o $@
# 在每个子目录下执行make命令
$(SUBDIRS):
$(MAKE) -C $@
# 生成目标文件的规则
$(OBJDIR)/%.o: %.c | $(OBJDIR)
$(CC) $(CFLAGS) -c $< -o $@
# 创建目标文件存放的目录
$(OBJDIR):
mkdir -p $@
clean:
rm -rf $(TARGET) $(OBJDIR)
```
然后,在每个子目录下创建各自的makefile,例如`dir1/Makefile`:
```makefile
# 定义当前子目录下的源文件
SRCS := file1.c
# 生成当前子目录下的目标文件
OBJS := $(addprefix $(OBJDIR)/, $(SRCS:.c=.o))
all: $(OBJS)
$(OBJS): $(SRCS) | $(OBJDIR)
$(CC) $(CFLAGS) -c $< -o $@
$(OBJDIR):
mkdir -p $@
clean:
rm -rf $(OBJS)
```
其他子目录的`Makefile`可以类似地创建。
这样,通过在主makefile中定义需要编译的子目录,并在其中执行各自的make命令,可以实现多目录的编译。同时,每个子目录下的makefile会将编译生成的目标文件放入统一的目标文件存放目录中。
使用`make`命令执行主makefile即可开始编译整个项目。使用`make clean`命令可以清除编译生成的目标文件和可执行文件。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)