那如何遍历这些目录,然后编译里面的c文件
时间: 2024-03-01 21:55:03 浏览: 21
遍历目录并编译其中的 c 文件,可以使用以下 Makefile:
```
SRCDIR = src_dir1 src_dir2 src_dir3
SRCEXT = c
OBJDIR = obj
CC = gcc
CFLAGS = -Wall
# 获取指定目录下的所有源文件
get_sources = $(wildcard $(addsuffix /*.$(1),$(2)))
# 获取指定目录下的所有源文件的对象文件路径
get_objs = $(patsubst %.$(1),$(OBJDIR)/%.o,$(notdir $(call get_sources,$(1),$(2))))
# 所有的源文件
SOURCES = $(foreach ext,$(SRCEXT),$(call get_sources,$(ext),$(SRCDIR)))
# 所有的对象文件
OBJECTS = $(foreach ext,$(SRCEXT),$(call get_objs,$(ext),$(SRCDIR)))
all: $(OBJECTS)
# 编译每个源文件生成对应的对象文件
$(OBJDIR)/%.o: $(foreach ext,$(SRCEXT),$(call get_sources,$(ext),$(SRCDIR)))
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -rf $(OBJDIR)/*
.PHONY: all clean
```
这个 Makefile 中,我们首先定义了 SRCDIR、SRCEXT、OBJDIR、CC 和 CFLAGS 等变量,以及两个辅助函数 get_sources 和 get_objs。
get_sources 函数可以获取指定目录下指定扩展名的所有源文件路径,例如:
```
$(call get_sources,c,$(SRCDIR))
```
可以获取 SRCDIR 目录下所有扩展名为 c 的源文件路径。
get_objs 函数可以获取指定目录下指定扩展名的所有源文件对应的对象文件路径,例如:
```
$(call get_objs,c,$(SRCDIR))
```
可以获取 SRCDIR 目录下所有扩展名为 c 的源文件对应的对象文件路径。
然后,我们使用这两个函数来定义 SOURCES 和 OBJECTS 变量,分别表示所有的源文件和所有的对象文件。
在 all 目标中,我们使用 $(OBJECTS) 变量来指定编译目标,make 会自动根据依赖关系编译每个源文件并生成对应的对象文件。其中,我们使用了 $(foreach) 函数和 $(call) 函数来遍历 SRCDIR 目录和获取所有的源文件和对象文件路径。
最后,我们定义了一个 clean 目标来清理所有的对象文件。
注意,在上面的 Makefile 中,我们假设所有的源文件都可以通过单独编译生成对应的对象文件,因此在 $(OBJDIR)/%.o: 依赖中只使用了一个源文件路径。如果你的源文件之间存在依赖关系,需要在依赖中指定所有的源文件路径。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![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)