Makefile利用函数,指定文件夹下面源文件(成百上千)生成目标文件。
时间: 2024-03-10 08:46:43 浏览: 25
可以使用Makefile中的函数和通配符来指定文件夹下的源文件并生成目标文件。
首先,可以使用函数`wildcard`来获取指定文件夹下的所有源文件,例如:
```makefile
SRC_DIR := src
SRCS := $(wildcard $(SRC_DIR)/*.c)
```
这里将所有以`.c`结尾的文件都存储在变量`SRCS`中。接下来,可以使用函数`patsubst`来将源文件名转换成目标文件名,例如:
```makefile
OBJ_DIR := obj
OBJS := $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SRCS))
```
这里将`SRCS`中的每个文件名都转换成以`.o`结尾的目标文件名,并将其存储在变量`OBJS`中。注意,这里使用了变量`$(SRC_DIR)`和`$(OBJ_DIR)`来指定源代码和目标代码所在的文件夹。
最后,可以使用`$(CC)`来指定编译器,并将`OBJS`作为依赖项来生成目标文件,例如:
```makefile
CC := gcc
CFLAGS := -Wall -Werror
myapp: $(OBJS)
$(CC) $(CFLAGS) -o $@ $^
```
这里使用了变量`$(CC)`来指定编译器,变量`$(CFLAGS)`来指定编译选项,`$@`表示目标文件名,`$^`表示所有依赖项的列表。最后,使用目标`myapp`来生成目标文件。
相关问题
Makefile利用函数,指定文件夹下面源文件(成百上千)生成目标文件。
可以使用Makefile中的函数`wildcard`和`patsubst`来指定文件夹下的源文件并生成目标文件。
假设源文件存放在`src/`文件夹下,目标文件存放在`obj/`文件夹下,可以使用以下代码:
```
# 指定源文件所在文件夹
SRC_DIR := src
# 指定目标文件所在文件夹
OBJ_DIR := obj
# 使用wildcard函数获取SRC_DIR文件夹下的所有.c文件
SRCS := $(wildcard $(SRC_DIR)/*.c)
# 使用patsubst函数将SRCS中的.c文件替换成.o文件,存储到OBJS中
OBJS := $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRCS))
# 定义编译命令
CC := gcc
CFLAGS := -Wall
# 定义目标文件生成规则
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
# 定义默认目标all,生成所有目标文件
all: $(OBJS)
# 定义清理命令
clean:
rm -f $(OBJS)
```
在终端中执行`make`命令即可生成所有目标文件。
利用Makefile函数,两个不同src文件夹中的源文件和inc文件夹下的头文件生成obj文件夹.o文件,最后通过Makefile将所有文件打包编译
好的,这是一个比较常见的Makefile编写问题。下面是一个简单的Makefile示例,可以满足您的需求:
```
# 定义变量
CC = gcc
CFLAGS = -Wall -I./inc
SRC_DIR1 = src1
SRC_DIR2 = src2
OBJ_DIR = obj
BIN = myprogram
# 获取源文件列表
SRCS1 := $(wildcard $(SRC_DIR1)/*.c)
SRCS2 := $(wildcard $(SRC_DIR2)/*.c)
# 将源文件列表转换为目标文件列表
OBJS1 := $(patsubst $(SRC_DIR1)/%.c,$(OBJ_DIR)/%.o,$(SRCS1))
OBJS2 := $(patsubst $(SRC_DIR2)/%.c,$(OBJ_DIR)/%.o,$(SRCS2))
# 定义规则
all: $(BIN)
$(BIN): $(OBJS1) $(OBJS2)
$(CC) $^ -o $@
$(OBJ_DIR)/%.o: $(SRC_DIR1)/%.c | $(OBJ_DIR)
$(CC) $(CFLAGS) -c $< -o $@
$(OBJ_DIR)/%.o: $(SRC_DIR2)/%.c | $(OBJ_DIR)
$(CC) $(CFLAGS) -c $< -o $@
$(OBJ_DIR):
mkdir $(OBJ_DIR)
clean:
rm -rf $(OBJ_DIR) $(BIN)
```
这个Makefile文件中,我们定义了以下变量:
- `CC`:编译器
- `CFLAGS`:编译选项,包括启用所有警告和指定头文件目录
- `SRC_DIR1`、`SRC_DIR2`:两个源文件目录
- `OBJ_DIR`:目标文件目录
- `BIN`:可执行文件名
接下来,我们使用`wildcard`函数获取源文件列表,再使用`patsubst`函数将源文件列表转换为目标文件列表。
然后,我们定义了以下规则:
- `all`:默认规则,编译可执行文件
- `$(BIN)`:依赖于所有的目标文件,链接成可执行文件
- `$(OBJ_DIR)/%.o`:将每个源文件编译成目标文件
- `$(OBJ_DIR)`:创建目标文件目录
- `clean`:删除所有生成的文件
最后,我们可以在命令行中使用`make`命令来编译程序。
相关推荐
![tar](https://img-home.csdnimg.cn/images/20210720083646.png)
![gz](https://img-home.csdnimg.cn/images/20210720083447.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)